Java 带词边界的 RegEx 语法?

Java RegEx Syntax with Word Boundaries?

首先,我的语法不会成为脚本的一部分,但会通过表单输入进行解析——因此任何指向 Java 代码的 'existing' 解决方案本身将不适用.

好的,这就是我需要做的:我需要能够输入如下术语:

'This is your airport and this is your car.' 以仅匹配单词 'airport' 或 'airports' 的方式进入输入字段。因此,不应匹配“99airport”或 'airport99' 之类的内容。我很接近!

(?i).*\bair[port|ports].*

如果我在测试站点中将以上内容作为 RegEx 输入:

http://www.ocpsoft.org/tutorials/regular-expressions/java-visual-regex-tester/#!;t=123-45-6789%0A9876-5-4321%0A987-65-4321%20(attack)%0A987-65-4321%20%0A192-83-7465&r=(%3Fm)%5E(%5Cd%7B3%7D-%3F%5Cd%7B2%7D-%3F%5Cd%7B4%7D)%24&x=Found%20good%20SSN%3A%20%241

那么,事实上,'99airport' 不匹配,因为开始使用词边界标识符 \b ;但是,我不知道如何将 \b 放在单词的结尾,这样 'airport99' 也不匹配。我尝试了几件事,但没有运气。我认为需要弄清楚 [] 周围的语法。

并且请不要太在意什么需要匹配或不需要——这些只是随机词。目前,如果我的输入有 'airport99',它确实会匹配,但如果我能找到解决方案,它应该不会匹配。

谢谢!

这个表达式应该符合您的要求:

(?i)\b(air)?port\b

它匹配 "port" 和 "airport" 但不匹配“99port”、"port99" 和“99airport”,也不匹配 "airport99"。

如果需要更通用的表达式,这个表达式应该匹配任何以 "air" 开头的单词加上一些其他(可选)字母,但没有数字或标点符号:

(?i)\b(air)?[a-z]*\b

我看到您正在使用 mather.matches 检查输入字符串中的单词。这就是为什么您需要在关键字前后加上 .*。由于文本来自输入字段,因此不需要匹配换行符,也不需要 (?s) singleline/dotall 修饰符。

然而,你错了character classes ([...]) with groups ((...))。字符 类 匹配 1 个字符。例如,[port|ports] 匹配 1 个字符,port|s。组可用于匹配符号的特定 序列 。例如。 (port|ports) 将匹配 portports.

因此,在您的情况下,您可以使用

(?i).*\bairports?\b.*

或 - 效率较低 -

(?i).*\bair(port|ports)\b.*

在Java、String patrn = "(?i).*\bairports?\b.*";