执行摘要:\R Java中是否存在任何警告/已知问题(或其他正则表达式模式)Scanner(特别是关于内部缓冲区的边界条件)?
细节:由于我想在潜在的多平台输入文件上进行一些多线模式匹配,我使用了模式\R,根据Patternjavadoc是:
任何Unicode换行序列都相当于
\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
无论如何,我注意到在我的一个测试文件中,应该解析一个十六进制转储块的循环被缩短了.经过一些调试后,我注意到它结束的那一行是Scanner内部缓冲区的结束.
这是我写的一个测试程序来模拟这种情况:
public static void main(String[] args) throws IOException {
testString(1);
testString(1022);
}
private static void testString(int prefixLen) {
String suffix = "b\r\nX";
String buffer = new String(new char[prefixLen]).replace("\0", "a") + suffix;
Scanner scanner = new Scanner(buffer);
String pattern = "b\\R";
System.out.printf("=================\nTest String (Len=%d): '%s'\n'%s' found with horizon=0 (w/o bound): %s\n", buffer.length(), convertLineEndings(
buffer), pattern, convertLineEndings(scanner.findWithinHorizon(pattern, 0)));
System.out.printf("'X' found with horizon=1: %b\n", scanner.findWithinHorizon("X", 1) != null);
scanner.close(); …Run Code Online (Sandbox Code Playgroud)