【发布时间】:2020-06-23 00:03:24
【问题描述】:
我正在努力思考如何编写一个匹配以下任何一个的正则表达式:
pirates
scallywags
pirates scallywags
scallywags pirates
但不是这些:
pirates pirates
scallywags scallywags
pirates booty scallywags
booty pirates
当然,我可以列出所有可能的排列作为替代:
(pirates|scallywags|pirates scallywags|scallywags pirates)
但我觉得应该有一种更简单/更有效的方法。
【问题讨论】:
-
Re "但我觉得应该有更简单/更有效的方式。",这绝对是最有效的方式
-
@ikegami 根据 regex101,我接受的答案需要 31 步才能匹配
pirates scallywags(如果在 cmets 中使用递归方法,则为 30),而(pirates|scallywags|pirates scallywags|scallywags pirates)则需要 33 步。虽然差别不大,但实际上效率并不高。 -
在 Perl 中,
'pirates scallywags' =~ /^(?:pirates|scallywags|pirates scallywags|scallywags pirates)\z/需要 24 步,而pirates scallywags' =~ /^(pirates|scallywags)(?! \1)( (pirates|scallywags))?\z/需要 38 步。前者也是35-40% faster