Java 如何使用“向前看”和“向后看”创建自定义边界匹配器?

Java 如何使用“向前看”和“向后看”创建自定义边界匹配器?,java,regex,lookahead,lookbehind,Java,Regex,Lookahead,Lookbehind,我想使用在单词边界处拆分字符串。通常情况下,这将如下所示: Scanner scanner = new Scanner(...).useDelimiter("\\b"); 问题是,我对“单词”字符的定义与标准的[a-zA-Z_0-9]有一点不同,因为我想包含更多字符并排除\u:[a-zA-Z0-9#/][/code>。因此,我不能使用\b模式 因此,我尝试使用“向前看”和“向后看”来做同样的事情,但我想到的方法不起作用: (<?=[A-Za-z0-9#/])(?![A-Za-z0-9#/

我想使用在单词边界处拆分字符串。通常情况下,这将如下所示:

Scanner scanner = new Scanner(...).useDelimiter("\\b");
问题是,我对“单词”字符的定义与标准的
[a-zA-Z_0-9]
有一点不同,因为我想包含更多字符并排除
\u
[a-zA-Z0-9#/][/code>。因此,我不能使用
\b
模式

因此,我尝试使用“向前看”和“向后看”来做同样的事情,但我想到的方法不起作用:

(<?=[A-Za-z0-9#/])(?![A-Za-z0-9#/])|(<?![A-Za-z0-9#/])(?=[A-Za-z0-9#/])
(有什么问题:

[^A-Za-z0-9#/]+
换句话说,集合中至少有一个字符的任何运行不是您的单词集合

或者如果你需要空间

[^A-Za-z0-9#/ ]+
然后在扫描仪(如果需要)后,将空间剥离出来进行特殊处理。

有什么问题:

[^A-Za-z0-9#/]+
换句话说,集合中至少有一个字符的任何运行不是您的单词集合

或者如果你需要空间

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

然后在扫描仪(如果需要的话)后将空格去掉以进行特殊处理。

语法有错误。
首先出现:

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

(?您的语法有错误。
首先出现:

(?<=[A-Za-z0-9#/])(?![A-Za-z0-9#/])|(?<![A-Za-z0-9#/])(?=[A-Za-z0-9#/])
 ^^                                  ^^
(?
新扫描仪(…)。使用分隔符(
“(?
新扫描仪(…).useDelimiter”(

(?只是一个小问题,但是你对
\b
的“标准”定义也是错误的。我没有给出一个,但我假设它类似于
(?这就是它应该如何定义的,如果你使用Java 7及其新模式,它就是。但是Java的传统
\b
更具创造性。请参阅以了解详细信息,特别是@tchrist的回答。这只是一个小点,但你对
\b
的“标准”定义也是错误的。我没有给出,但我假设它类似
(?这就是它应该如何定义的,如果你使用Java 7及其新模式,它就是。但是Java的传统
\b
有点…创造性。有关详细信息,请参阅,特别是@tchrist的答案。我还需要单词之间的空格。扫描器会使用你的正则表达式将它们吞下。我认为OP希望空格作为单独的“单词”/代币或我们称之为的任何东西:)我也需要单词之间的空格。扫描器会使用您的正则表达式将它们吞没。我认为OP希望空格作为单独的“单词”/代币或我们称之为的任何东西:)不,这要求前面有一个字符,后面有一个字符,因此它与字符串开头或结尾的单词边界不匹配。OP有正确的公式,他只是在语法上犯了一个小小的错误。他正在尝试为
\b
创建一个符合他对单词字符定义的等价项。他更正的正则表达式适用于exa当它们与扫描仪的
useDelimiter()一起使用时,与您的完全相同
method——我承认,我在写评论时没有意识到这一点。但我认为我的观点仍然是正确的:你的回答可能解决了他的问题,但它没有回答他的问题。@Alanmore-再次阅读他的问题-上面写着:
我想拆分一个字符串…
好的,他应该问的问题。:P他自己的问题,所以lution在语法上,而不是语义上。不,这要求前面有一个字符,后面有一个字符,因此它与字符串开头或结尾的单词边界不匹配。OP有正确的公式,他只是在语法上犯了一个小小的错误。他试图为
\b
创建一个符合他对wor定义的等价物当与Scanner的
usedimiter()一起使用时,他的修正正则表达式的工作原理与您的完全相同
method——我承认,我在写评论时没有意识到这一点。但我认为我的观点仍然是正确的:你的回答可能解决了他的问题,但它没有回答他的问题。@Alanmore-再次阅读他的问题-上面写着:
我想拆分一个字符串…
好的,他应该问的问题。:P他自己的问题,所以理解是语法上的,而不是语义上的。