带有单词边界的Java RegEx语法



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

好吧,我需要做的是:我需要能够输入一个术语,比如:

"这是你的机场,也是你的汽车。"输入字段中,只匹配单词"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%0A9876-4321%20(攻击)%0A9877-5-4321%20%0A192-83-7465&r=(%3Fm)%5E(%5Cd%7B3%7D-%3F%5%Cd%7B2%7D-%3F%5%Cd%7B4%7D)%24&x=找到%20good%20SSN%3A%20%241

那么,事实上,由于开始使用单词边界标识符b,"99airport"不匹配;然而,我不知道如何将\b放在单词的末尾,这样"airport99"也不匹配。我试过一些东西,但没有成功。我认为需要弄清楚的是围绕[]的语法。

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

谢谢!

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

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

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

(?i).*bairports?b.*

或效果较差的

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

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

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

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

它确实匹配"port"one_answers"airport",但不匹配"99port"或"port99"或"99airport"也不匹配"airport99"。

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

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

相关内容

  • 没有找到相关文章

最新更新