带有Word边界的Java RegEx语法?

时间:2015-11-16 14:00:02

标签: java regex word-boundaries

首先,我的语法不会成为脚本的一部分,但它将通过表单输入进行解析 - 因此任何指向Java代码的“现有”解决方案本身都不适用。

好的,所以这就是我需要做的事情:我需要能够输入一个术语,如:

'这是你的机场,这是你的车。'以这样的方式进入输入字段,只有“机场”或“机场”这个词才能匹配。所以不应该像'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'确实不匹配,因为开始使用Word边界标识符\b;但是,我不知道如何将\ b放在单词的结尾处,以便'airport99'也不匹配。我尝试过一些东西,但没有运气。我认为这是围绕[]的语法,需要弄清楚。

并且请不要过分关注需要匹配的内容 - 这些只是随机的单词。目前,如果我的输入有“airport99”,它确实匹配,但如果我能找到解决方案,它就不应该。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

但是,您将character classes ([...])误认为groups ((...))。字符类匹配1个字符。例如,[port|ports]匹配1个字符,port|s。组可用于匹配符号的特定序列。例如。 (port|ports)将匹配portports

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

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

或 - 效果不佳 -

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

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

答案 1 :(得分:1)

此表达式应符合您的要求:

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

匹配" port"和#34;机场"但不匹配" 99port"也不是" port99"也不是" 99机场"不是" airport99"。

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

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