我正在用Java手工开发一个语法分析器,我想使用正则表达式来解析各种标记类型。问题是,如果输入不符合语法,我也希望能够准确地报告当前的行号。
长话短说,当我尝试将换行符与Scanner类实际匹配时,我遇到了一个问题。具体地说,当我尝试使用Scanner类将换行符与模式进行匹配时,它失败了。几乎总是如此。但是,当我使用Matcher和相同的源字符串执行相同的匹配时,它检索到的换行符也完全符合您的预期。有没有这样的原因,我似乎没有发现,或者这是一个bug,正如我怀疑的那样?
仅供参考:我在Sun数据库中找不到描述此问题的bug,因此如果是bug,则尚未报告。
示例代码:
Pattern newLinePattern = Pattern.compile("(\\r\\n?|\\n)", Pattern.MULTILINE);
String sourceString = "\r\n\n\r\r\n\n";
Scanner scan = new Scanner(sourceString);
scan.useDelimiter("");
int count = 0;
while (scan.hasNext(newLinePattern)) {
scan.next(newLinePattern);
count++;
}
System.out.println("found "+count+" newlines"); // finds 7 newlines
Matcher match = newLinePattern.matcher(sourceString);
count = 0;
while (match.find()) {
count++;
}
System.out.println("found "+count+" newlines"); // finds 5 newlines发布于 2010-05-20 09:12:28
当您使用分隔符为""的Scanner时,它将生成每个字符长度为一个字符的标记。这是在应用您的新行regex之前。然后,它将这些字符中的每个字符与新行regex进行匹配;每个字符都匹配,因此它生成7个标记。但是,因为它将字符串拆分为1个字符的标记,所以它不会将相邻的\r\n字符组合到一个标记中。
https://stackoverflow.com/questions/2870393
复制相似问题