2

我编写了一个 Java 类,它必须从包含换行符的字符串中提取元素。作为第一步,代码必须用换行符分割输入字符串并将结果放入数组中。除了在一种特定情况下,这一切都很好。我正在使用以下代码来执行拆分:

String lines[] = inputText.split("[\\r?\\n\\r]+");

我遇到的问题是以下行:

##INFO=<ID=DS,Number=0,Type=Flag,Description=""removed?"">"

它导致两行:

##INFO=<ID=DS,Number=0,Type=Flag,Description=""removed
"">"

它在问号上分裂。谁能指出我为什么会发生这种情况的正确方向?正则表达式内部没有“?” 表示 0 或 1 次出现?这不是按换行符分割的可接受方式吗?

4

3 回答 3

0

这行得通,简单地说 \n\r 或 \n。

String manyLines = "line1\nline2\n\rline3?\nline4";
System.out.println(Arrays.asList(manyLines.split("\\n\\r|\\n")));

输出

[line1, line2, line3?, line4]
于 2013-02-17T09:27:23.223 回答
0

方括号内的问号实际上是一个问号。用圆括号替换方括号(前者仅限于每个交替一个字符):

String lines[] = inputText.split("(\\r?\\n|\\r)+");

行将在“\r\n”、“\n”和“\r”处拆分,但这实际上与以下内容相同:

String lines[] = inputText.split("(\\n|\\r)+");

所以我们可以回到方括号:

String lines[] = inputText.split("[\\n\\r]+");

如果您实际需要的是取决于操作系统的恒定换行符:

String lines[] = inputText.split("(" + System.getProperty("line.separator") + ")+");
于 2013-02-17T09:29:19.053 回答
0

您正在使用一个字符类([]),这意味着括号内的任何字符,所以在您的情况下意味着[\\r?\\n\\r]+任何一个,,,,,,一次或多次(+)\\r\\n?\\r

由Unicode UTS #18: Unicode Regular Expressions定义的换行符的真正可移植正则表达式是:

\R => (?:(?>\u000D\u000A)|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])

正如Perl 成名的 Tom Christiansen在这个答案中所解释的那样。考虑 Java 的双重转义(字符串然后是正则表达式):

(?:(?>\\u000D\\u000A)|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])
于 2013-02-17T09:32:06.360 回答