java - 强制正则表达式匹配可选组

标签 java regex scala parser-combinators

我想在文本中搜索字符串“W foo X bar Y baz Z”。 W、X、Y、Z 是不重要的分隔符,我不能搜索它们。 foo, bar 和 baz 是我感兴趣的单词。顺序并不重要。 我想知道我要求的单词在文本中出现的有多“好”。

我正在尝试以下操作

(?:\Qfoo\E)?.{0,3}(?:\Qbar\E)?.{0,3}(?:\Qbaz\E)?

我的推理是:

  • 将每个单词打包到一个可选组中,因此不需要出现 [ (?: 是非捕获组,\Q...\E 只是转义 ]
  • 用 .{0,3} 分隔每个单词(任何字符,出现 0-3 次)

此 Regex 始终匹配,因为它仅包含可选组,但结果匹配始终为空,即使它可以完全匹配所有可选组。 但是,我想对结果匹配进行后处理,因此我需要它尽可能多地捕获。

我可以强制 Regex 尝试尽可能匹配所有组吗?

或者您是否知道如何完成对几个单词的搜索,用某些东西隔开,然后检查出现的单词以计算一些相似度?

非常感谢

最佳答案

我认为仅使用 Regex 来解决您的问题会有些困难。

我建议您看一下 Scala 的一个强大功能,命名为 Parser Combinator。

使用它,您必须能够结合使用正则表达式来匹配内部元素,并使用解析策略来找出它们。

这是一篇清晰明了的帖子,您可以在其中找到有关此 Parser Combinator 的相关信息.

可以做的就是把你的内容看成

delim = "[a-z]{0,3}".r
value = "foo|bar|baz".r
expr = delim ~ value ~ expr

我的 2c

关于java - 强制正则表达式匹配可选组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8718210/

相关文章:

scala play json未找到unapply或unapplySeq函数

java - 通过创建 REST 端点使用 spring-boot 发送电子邮件

java - 在 Java 应用程序中嵌入类似浏览器的 View 并与之交互

java - Java 网络,客户端多行响应中出现 'readLine()'

javascript - 正则表达式在查找字母字符时分割数字字符串

regex - 排除 vim 语法高亮的模式

ruby-on-rails - 如何使用 Ruby/Rails 查找字符串中的特定单词

scala - 如何将基于时间的观察者添加到 Scala Future?

java - Mybatis 将多个结果集映射到对象内部集合

scala - 手动创建类型标签