1

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

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

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

4

1 回答 1

2

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

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

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

这几乎\b就是单词边界结构的工作方式:

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

也就是说,一个位置要么前面有一个单词字符但后面没有一个,或者后面有一个单词字符但前面没有一个。不同之处在于\b可以在输入的开头和结尾进行匹配。你显然不希望这样,所以我添加了环视来排除这些条件:

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

这只是一种更简洁的方式来完成您的正则表达式所做的事情。但是随后您将要求更改为匹配数字/非数字边界,并且没有像\b单词/非单词边界那样的简写。

于 2010-03-03T11:53:16.507 回答