如何使用前瞻和后视创建自定义边界匹配器?

时间:2012-10-22 14:05:45

标签: java regex lookahead lookbehind

我想使用Scanner在字边界处拆分字符串。通常,这将是这样做的:

Scanner scanner = new Scanner(...).useDelimiter("\\b");

问题是我对“单词”字符的定义与标准[a-zA-Z_0-9]略有不同,因为我想要包含更多字符并排除_[a-zA-Z0-9#/]。因此,我无法使用\b模式。

所以我尝试使用前瞻和后视来做同样的事情,但我提出的并不起作用:

(<?=[A-Za-z0-9#/])(?![A-Za-z0-9#/])|(<?![A-Za-z0-9#/])(?=[A-Za-z0-9#/])

扫描仪不会在任何地方拆分。

是否可以使用前瞻和后视以及如何做到这一点?

3 个答案:

答案 0 :(得分:3)

语法错误。 ?首先出现:

(?<=[A-Za-z0-9#/])(?![A-Za-z0-9#/])|(?<![A-Za-z0-9#/])(?=[A-Za-z0-9#/])
 ^^                                  ^^

答案 1 :(得分:1)

new Scanner(...).useDelimiter(
  "(?<=[a-zA-Z0-9#/])(?=[^a-zA-Z0-9#/])|(?<=[^a-zA-Z0-9#/])(?=[a-zA-Z0-9#/])");

答案 2 :(得分:0)

出了什么问题:

[^A-Za-z0-9#/]+

换句话说,集合中至少有一个字符的运行不是你的单词集

或者如果你需要空格

[^A-Za-z0-9#/ ]+

然后在扫描仪(如果需要)

之后将空格去掉以进行特殊处理