Java:使用scanner定界符作为标记

时间:2010-03-03 11:41:31

标签: java regex token java.util.scanner delimiter

我正在尝试找到一种让扫描器使用给定分隔符作为令牌的好方法。例如,我想将一段文本分成数字和非数字块,所以理想情况下我只需将分隔符设置为\D并设置一些标记,如useDelimiterAsToken,但在简要查看之后API我没想出任何东西。现在我不得不求助于使用组合式前瞻/后视镜作为分隔符,这有点痛苦:

scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))");

这会查找从数字到非数字的任何转换,反之亦然。是否有更明智的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

编辑:编辑的问题是如此不同,我的原始答案根本不适用。在我看来,对于记录,您正在做的 是解决问题的理想方式。您的分隔符是数字和非数字之间的零宽度边界,并且没有比您发布的更简洁的表达方式。

EDIT2 :(回应评论中提到的问题。)您最初要求替代此正则表达式:

"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))"

这几乎完全是\b这个词边界结构的作用:

"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)"

即,一个位置,前面是一个单词字符,后面没有一个字符,或者后跟一个单词字符,前面没有一个字符。区别在于\b可以在输入的开头和结尾匹配。你显然不希望这样,所以我添加了一些外观来排除这些条件:

"(?!^)\\b(?!$)"

这只是一种更简洁的方式来做你的正则表达式所做的事情。但后来你改变了匹配数字/非数字边界的要求,而且对于单词/非单词边界没有像\b那样的简写。