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

hot*_*zen 1 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)?
Run Code Online (Sandbox Code Playgroud)

我的理由是:

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

此正则表达式始终匹配,因为它只包含可选组,但结果匹配始终为空,即使它可以完全匹配所有可选组.但是,我想对结果匹配进行后期处理,因此我需要尽可能多地捕获它.

我可以强制正则表达式尝试尽可能匹配所有组吗?

或者您是否知道如何搜索多个单词,由某些单词分隔,然后检查哪些单词出现以计算某些相似性?

非常感谢你

and*_*lla 5

我认为通过简单地使用Regex来解决您的问题会有一些困难.

我建议你看看一个强大的Scala功能,命名为Parser Combinator.

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

这是一个清晰而简洁的帖子,您可以在其中找到有关此Parser Combinator的相关信息.

可以做的是将您的内容视为

delim = "[a-z]{0,3}".r
value = "foo|bar|baz".r
expr = delim ~ value ~ expr
Run Code Online (Sandbox Code Playgroud)

我的2c