1

首先,我的语法本身不会是脚本的一部分,但它会通过表单输入进行解析——因此任何指向 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%0A987-65-4321%20(攻击)%0A987-65-4321%20%0A192-83-7465&r=(%3Fm)%5E(%5Cd%7B3%7D-%3F%5Cd%7B2%7D-%3F%5Cd%7B4%7D)%24&x =找到%20good%20SSN%3A%20%241

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

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

谢谢!

4

2 回答 2

2

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

但是,您将字符类 ( [...])组 ( (...))混淆了。字符类匹配 1 个字符。例如,[port|ports]匹配 1 个字符,即p, o, r, t, |, 或s. 组可用于匹配特定的符号序列。例如(port|ports),将匹配portports

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

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

或 - 效率较低 -

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

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

于 2015-11-16T14:38:41.400 回答
1

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

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

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

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

(?i)\\b(air)?[a-z]*\\b
于 2015-11-16T14:14:47.307 回答