我遇到了一个我觉得很有趣的问题。我主要通过正则表达式对文本文件进行一些基本解析,并且在匹配此行时它总是冻结
ftrect 0.7031 57.0313 9.8561 55.5313 "FREIGABE \nQ09_SV01"
不抛出异常;该程序只是挂起。我正在发布重现这种情况的程序片段;评论的一种是可能的标准情况,但另一种是有问题的。如果您删除 \n 它可以工作,但是这些解析的文件来自“黑盒”系统。
我当然可以做一个解决方法,我只是发现它实际上冻结并希望有人能解释正在发生的事情很有趣。我在JDK6u22和JDK7u21上试过...
public static Pattern FTRECT_PATTERN = Pattern.compile(
"\\s*([\\w]+)?\\:?\\s*ftrect\\s+((\\d*\\.?\\d*\\s?)+)\\s*\"?([\\w\\s\\.\\%\\/\\=]*)?\"?\\s*"
);
public static void main(String[] args) {
// Matcher m = FTRECT_PATTERN.matcher( "FOX_BACKGROUND: ftrect 46.1719 18.0556 54.8633 16.5556 \"Schicht\" " );
Matcher m = FTRECT_PATTERN.matcher( "ftrect 0.7031 57.0313 9.8561 55.5313 \"FREIGABE \\nQ09_SV01\"" );
System.out.println( m.matches() );
for (int i = 0; i <= m.groupCount(); i++) {
String string = m.group( i );
System.out.println( string );
}
}
好吧,我发现如果我将正则表达式修改为此(添加\\\\
到最后一组):
public static Pattern FTRECT_PATTERN = Pattern.compile(
"\\s*([\\w]+)?\\:?\\s*ftrect\\s+((\\d*\\.?\\d*\\s?)+)\\s*\"?([\\w\\\\\\s\\.\\%\\/\\=]*)?\"?\\s*"
);
我仍然不知道为什么没有抛出异常。