我正在尝试找到一种让扫描器使用给定分隔符作为令牌的好方法。例如,我想将一段文本分成数字和非数字块,所以理想情况下我只需将分隔符设置为\D
并设置一些标记,如useDelimiterAsToken,但在简要查看之后API我没想出任何东西。现在我不得不求助于使用组合式前瞻/后视镜作为分隔符,这有点痛苦:
scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))");
这会查找从数字到非数字的任何转换,反之亦然。是否有更明智的方法来做到这一点?
答案 0 :(得分:1)
EDIT2 :(回应评论中提到的问题。)您最初要求替代此正则表达式:
"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))"
这几乎完全是\b
这个词边界结构的作用:
"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)"
即,一个位置,前面是一个单词字符,后面没有一个字符,或者后跟一个单词字符,前面没有一个字符。区别在于\b
可以在输入的开头和结尾匹配。你显然不希望这样,所以我添加了一些外观来排除这些条件:
"(?!^)\\b(?!$)"
这只是一种更简洁的方式来做你的正则表达式所做的事情。但后来你改变了匹配数字/非数字边界的要求,而且对于单词/非单词边界没有像\b
那样的简写。