【问题标题】:Find the maximal input string matching a regular expression查找匹配正则表达式的最大输入字符串
【发布时间】:2018-02-04 18:54:34
【问题描述】:

给定一个正则表达式re和一个输入字符串str,我想找到str的最大子字符串,它从匹配re的最小位置开始。

特殊情况:

re = Regex("a+|[ax](bc)*"); str = "yyabcbcb"

将 re 与 str 匹配应返回匹配字符串 "abcbc"(而不是像 PCRE 那样返回 "a")。我还记得,如果更改顺序,结果就是我想要的。

【问题讨论】:

  • 然后使用"[ax](?:bc)*|a+"。一旦aa+ 匹配,您就不能指望尝试下一个替代方案。
  • 但这正是我想要的。我需要一种“贪婪的交替”。此外,将给定的正则表达式调整到输入字符串也不是一种选择。例如 str = "yyaaaa" 输出应为 "aaaa" 而不是 "a"。
  • PCRE 是一个 NFA 正则表达式引擎,其中匹配的第一个替代模式使正则表达式引擎跳过其余的替代模式。没有办法让它表现得不同。使用 DFA 正则表达式库,如 sed / grep 和其他基于 POSIX 的正则表达式引擎。
  • 你能推荐一个特定的正则表达式库,它可以满足我的目的吗?理想情况下,它应该是可用于 Linux、Windows、Mac-OS 的 C 代码。

标签: string pcre regex-alternation


【解决方案1】:

我找到的选项是:

  1. POSIX 扩展 RE - 可能已过时,由 egrep 使用 ...
  2. Google 提供的 RE2 - 开源 RE2 - C++ - 也提供 C 包装器

【讨论】:

    【解决方案2】:

    在我看来,您的问题有两个问题。

    首先是改变交替的顺序,结果应该改变。

    对于字符串中的每个“a”,它可以匹配“a+”或“ax*”。 因此,将 'a' 与正则表达式中的交替匹配是不明确的。

    其次,为了找到最大的子串,它需要最长匹配的匹配模式。据我所知,只有RE2 提供了这样的功能,正如@Cosinus 所提到的。

    所以我的建议是将“a+|ax*”分成两个正则表达式,在每个正则表达式中找到最大的子字符串,然后比较两个子字符串的位置。

    至于找到最长的匹配,也可以参考previous regex post description here。主要思想是搜索从字符串位置 0 到 len(str) 的子字符串,并在找到匹配的子字符串时跟踪长度和位置。

    附:一些语言提供类似于“findall()”的正则表达式函数。 使用它们时要小心,因为返回可能是不重叠的匹配项。并且不重叠的匹配不一定包含最长的匹配子串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2015-06-15
      • 2015-04-02
      • 2017-08-29
      • 2022-10-17
      • 2014-11-26
      相关资源
      最近更新 更多