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

Java用带问号的换行正则表达式拆分字符串,java,regex,string,split,newline,Java,Regex,String,Split,Newline,我已经编写了一个Java类,它必须从包含换行符的字符串中提取元素。作为第一步,代码必须按换行符拆分输入字符串,并将结果放入数组中。除了一个特殊情况外,这一切都很正常。我使用以下代码执行拆分: String lines[] = inputText.split("[\\r?\\n\\r]+"); 我遇到的问题是以下几行: ##INFO=<ID=DS,Number=0,Type=Flag,Description=""removed?"">" ##INFO=” 结果有两行: ##INF

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

String lines[] = inputText.split("[\\r?\\n\\r]+");
我遇到的问题是以下几行:

##INFO=<ID=DS,Number=0,Type=Flag,Description=""removed?"">"
##INFO=”
结果有两行:

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

它在问号上分裂。有人能告诉我为什么会这样吗?在正则表达式中,“?”不表示出现0或1?这不是一种可以接受的按换行符拆分的方式吗?

这很有效,只需说\n\r或\n即可

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

[line1, line2, line3?, line4]

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

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

String lines[] = inputText.split("(\\n|\\r)+");
我们可以回到方括号:

String lines[] = inputText.split("[\\n\\r]+");
如果您实际需要的是一个恒定的换行符,具体取决于操作系统:

String lines[] = inputText.split("(" + System.getProperty("line.separator") + ")+");

您正在使用字符类(
[]
),它表示括号内的任何字符,因此在您的情况下,
[\\r?\\n\\r]+
,它表示
\\r
\\n
\\r
,一次或多次(+)

换行符的真正可移植正则表达式由定义为:

正如Perl fame的Tom Christiansen在上所解释的那样。考虑Java的双重转义(字符串然后是正则表达式):


拆分('\\n')
不起作用吗??表示0或1,但不在[]组内,这表示一个文字问号,因此您的奇怪结果是肯定的,但我还必须能够处理Windows样式的换行符。我以为这样写正则表达式是安全的。但可能不是@BenShirley你可以看看,让它独立于平台吗?难道
[\n\r]+
就足够了吗?
String lines[] = inputText.split("(" + System.getProperty("line.separator") + ")+");
\R => (?:(?>\u000D\u000A)|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])
(?:(?>\\u000D\\u000A)|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])