Java使用带问号的换行符正则表达式分割字符串

时间:2013-02-17 09:03:05

标签: java regex string split newline

我编写了一个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次出现?这不是一种可以通过换行分割的方法吗?

3 个答案:

答案 0 :(得分:0)

这很有效,只需说\ n \ r \ n OR \ n。

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

输出

[line1, line2, line3?, line4]

答案 1 :(得分: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") + ")+");

答案 2 :(得分: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在this answer所解释的那样。考虑Java的双重转义(字符串然后正则表达式):

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