首先,我的语法不会是脚本的一部分,但它将通过表单输入进行解析,因此任何指向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个字符,即p
、o
、r
、t
、|
或s
。组可用于匹配符号的特定序列。例如,(port|ports)
将与port
或ports
相匹配。
因此,在您的情况下,您可以使用
(?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