【问题标题】:Java RegEx Syntax with Word Boundaries?带有单词边界的Java RegEx语法?
【发布时间】:2016-02-17 15:47:06
【问题描述】:

首先,我的语法本身不会是脚本的一部分,但它会通过表单输入进行解析——因此任何指向 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(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).*\bairports?\b.*。在 Java 中,String patrn = "(?i).*\\bairports?\\b.*";
  • 谢谢。除了我还需要 [ ]; 中的可能组合之外,这将起作用。你看,在现实生活中,我试图捕捉“龙卷风”或“龙卷风”或“ToRNADOES”之类的词,同时阻止捕捉“FCGTornadoTeam”。
  • country/countries 呢?
  • 是的,可以与 [y|ies] 一起作为国家使用
  • 您将组误认为是字符类。让我在答案中解释一下。

标签: java regex word-boundaries


【解决方案1】:

我看到您正在使用 mather.matches 检查输入字符串中的单词。这就是为什么您需要在关键字前后使用.*。由于文本来自输入字段,因此您不需要匹配换行符,也不需要在(?s)singleline/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.*";

【讨论】:

  • 是的,(?i).*\bair(port|ports)\b.* 做到了!我的问题是使用 [ ] 而不是 () 来捕获端口|端口。我会看看这是否可以在实际程序中工作 - 它应该。感谢您的帮助和解释。 RegEx 的新手,并不是真正的 Java 人。
  • 我真的想强调一个事实,即仅使用ports?(其中s? 匹配1 或0 s)是(port|ports) 的更好替代方案.对于国家/地区,您无法使用替代组进行转义,但只要有可能,只需使用可选量词 ?(出现 1 次或 0 次)。它将涉及更少的回溯,并提高性能。好吧,如果您的输入字符串很短,那应该不是问题。最佳实践就是最佳实践 :)
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 我承认也许我没有 100% 正确地表述这个问题——如果我可以阻止 '99airport' 和 'airport99' 匹配,同时仍然保留 [ ] 中可能出现的单词,那么将是我所需要的。我仍然需要考虑 [ ] 内部的内容,并且不确定您的解决方案是否考虑了这一点。道歉。
  • 呵呵。是的,它发生了:-)我建议你在你的问题中包括几个应该匹配的例子和其他不应该匹配的例子。
  • 感谢理解。重新表述了问题。
  • 谢谢!我认为 stribizhev 的答案完全符合要求;我很接近,但使用 [ ] 而不是 () 来捕捉端口或端口的可能性。
猜你喜欢
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2016-02-26
相关资源
最近更新 更多