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