查找与正则表达式匹配的最大输入字符串



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

特例:

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

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

我找到的选项是:

  1. POSIX 扩展 RE - 可能已经过时,由 egrep 使用......
  2. 谷歌的RE2 - 开源RE2 - C++ - 也提供C-wrapper

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

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

对于字符串中的每个"a",它可以匹配"a+"或"ax*"。 因此,将"a"与正则表达式中的交替匹配是模棱两可的。

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

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

至于找到最长的匹配,你也可以参考以前的正则表达式帖子描述 这里.主要思想是搜索从字符串位置 0 到 len(str) 的子字符串,并在找到匹配的子字符串时跟踪长度和位置。

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

最新更新