【问题标题】:Forcing a Regular Expression to match optional groups强制正则表达式匹配可选组
【发布时间】:2012-01-03 20:31:34
【问题描述】:

我想在文本中搜索字符串“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 尝试尽可能匹配所有组吗?

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

非常感谢

【问题讨论】:

  • 好吧,你有一些问题。首先 - 什么是合法输入?由于您的所有“必填词”都是可选的,并且.{0,3} 两次,该模式可以匹配任何 6 个字符(包括"1bar2",但不是您所期望的 - 不捕获(bar)!)。所有组真的是可选的吗?你能更好地定义分隔符吗?我首先尝试在分隔符与其前一个组之间创建链接,例如:(?:foo.{0,3})?(?:bar.{0,3})?(?:baz)?(如果您能澄清并提供更多示例,我们可以做得更好)
  • 如果要匹配文本,为什么要使用 ? 量词?您使用哪些正则表达式方法进行匹配?

标签: java regex scala parser-combinators


【解决方案1】:

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

我建议你看看一个强大的 Scala 特性,命名为 Parser Combinator。

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

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

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

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

我的 2c

【讨论】:

  • 我知道解析器组合器,但不确定它们是否符合我的问题,但会尝试。谢谢
【解决方案2】:

首先猜测一下,我会尝试这样的正则表达式

(foo|bar|baz|anyothercombination)

然后使用匹配计数属性

(如果您需要 sn-p,只需查找此内容并回复您)

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多