给定一个正则表达式 re 和一个输入字符串 str,我想找到 str 的最大子字符串,它从最小位置开始,与 re 匹配。
特例:
re = Regex("a+|[ax](bc)*"); str = "yyabcbcb"
将 re 与 str 匹配应该返回匹配的字符串"abcbc"
(而不是像 PCRE 那样返回"a"
)。我还想到,如果改变交替的顺序,结果是我想要的。
我找到的选项是:
- POSIX 扩展 RE - 可能已经过时,由 egrep 使用......
- 谷歌的RE2 - 开源RE2 - C++ - 也提供C-wrapper
在我看来,你的问题有两个问题。
首先,改变交替的顺序,结果应该改变。
对于字符串中的每个"a",它可以匹配"a+"或"ax*"。 因此,将"a"与正则表达式中的交替匹配是模棱两可的。
其次,为了找到最大子字符串,它需要最长匹配的匹配模式。据我所知,正如@Cosinus所提到的,只有 RE2 提供了这样的功能。
所以我的建议是将"a+|ax*"分成两个正则表达式,在每个正则表达式中找到最大子字符串,然后比较两个子字符串的位置。
至于找到最长的匹配,你也可以参考以前的正则表达式帖子描述 这里.主要思想是搜索从字符串位置 0 到 len(str) 的子字符串,并在找到匹配的子字符串时跟踪长度和位置。
附言一些语言提供类似于"findall()"的正则表达式函数。小心使用它们,因为返回可能是非重叠的匹配项。非重叠匹配项不一定包含最长的匹配子字符串。