1

所以我按行分隔符拆分字符串,但我也想保存稍后将字符串重新组合在一起时使用的行分隔符。我怎样才能做到这一点?

String data = "Multi\n Line\r Text\n";
List<String> separators = new ArrayList<>();
String lines[] = data.split("\\r?\\n|\\r");
separators.add(???);

老实说,我不知道如何捕捉它。String.Split 可以吗?还是有另一种方法可以做到这一点?

我最初是从文件中获取字符串。有没有办法在将行分隔符转换为字符串之前以这种方式获取和保存行分隔符?

4

2 回答 2

0
String data = "Multi\n Line\r Text\n";
List<String> separators = new ArrayList<>(Arrays.asList(data.split("[[^\\r?\\n]&&[^\\r]]+")));
separators.remove(0); // first element is an empty string
String lines[] = data.split("\\r?\\n|\\r");

//reconstruction
for (int i = 0; i < lines.length; i++) {
    System.out.print(lines[i] + StringEscapeUtils.escapeJava(separators.get(i)).trim());
}

输出

Multi\n Line\r Text\n
于 2018-11-19T03:22:22.670 回答
0

您可以使用 StringTokenizer 作为起点:

    String data = "Multi\n Line\r Text\n and now a two-char \r\nline separator";
    StringTokenizer tokenizer = new StringTokenizer(data, "\n\r", true);
    List<String> tokensAndDelimiters = new ArrayList<>();
    while (tokenizer.hasMoreTokens()) {
        tokensAndDelimiters.add(tokenizer.nextToken());
    }
    tokensAndDelimiters.replaceAll((token) -> token.replace("\n", "\\n").replace("\r", "\\r"));
    System.out.println("tokensAndDelimiters = " + tokensAndDelimiters);

上述代码的输出是:

tokensAndDelimiters = [Multi, \n,  Line, \r,  Text, \n,  and now a two-char , \r, \n, line separator]

第三个 StringTokenizer 构造函数参数指示将分隔符作为标记返回。我只是替换行分隔符,以便它们清楚地打印出来。需要注意的一点是,如果您有一个典型的 windows 行分隔符 ("\r\n"),这将作为两个标记出现,因为 StringTokenizer 只处理单个字符分隔符。

于 2018-11-19T03:00:58.287 回答