首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用regex进行Java Scanner换行符解析(Bug?)

使用regex进行Java Scanner换行符解析(Bug?)
EN

Stack Overflow用户
提问于 2010-05-20 08:51:47
回答 4查看 5.1K关注 0票数 4

我正在用Java手工开发一个语法分析器,我想使用正则表达式来解析各种标记类型。问题是,如果输入不符合语法,我也希望能够准确地报告当前的行号。

长话短说,当我尝试将换行符与Scanner类实际匹配时,我遇到了一个问题。具体地说,当我尝试使用Scanner类将换行符与模式进行匹配时,它失败了。几乎总是如此。但是,当我使用Matcher和相同的源字符串执行相同的匹配时,它检索到的换行符也完全符合您的预期。有没有这样的原因,我似乎没有发现,或者这是一个bug,正如我怀疑的那样?

仅供参考:我在Sun数据库中找不到描述此问题的bug,因此如果是bug,则尚未报告。

示例代码:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-05-20 09:12:28

当您使用分隔符为""Scanner时,它将生成每个字符长度为一个字符的标记。这是在应用您的新行regex之前。然后,它将这些字符中的每个字符与新行regex进行匹配;每个字符都匹配,因此它生成7个标记。但是,因为它将字符串拆分为1个字符的标记,所以它不会将相邻的\r\n字符组合到一个标记中。

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2870393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档