是否可以让正则表达式回退到字符串的开头并再次开始匹配?
这就是我问的原因。给定下面的字符串,我想按该顺序捕获子字符串black
、red
、blue
和 green
,无论主题字符串中的出现顺序如何,并且仅当所有子字符串都存在于主题字符串中时。
$str ='blue-ka93-red-kdke3-green-weifk-black'
因此,对于以下所有字符串,正则表达式应捕获black
、red
、blue
和green
(按此顺序)
'blue-ka93-red-kdke3-green-weifk-black'
'green-ka93-red-kdke3-blue-weifk-black'
'blue-ka93-black-kdke3-green-weifk-red'
'green-ka93-black-kdke3-blue-weifk-red'
我想知道是否有办法匹配捕获组,然后回退到字符串的开头并找到下一个捕获组。我希望像^.*(?=(black))^.*(?=(red))^.*(?=(blue))^.*(?=(green))
这样的东西会起作用,但当然^
和展望不会以这种方式行事。
是否有可能构建这样的正则表达式?
对于上下文,我将在PHP中使用正则表达式。
您可以使用
^(?=.*(black))(?=.*(red))(?=.*(blue))(?=.*(green))
注意:这将要求所有这些关键字都在字符串中。
查看演示
匹配时无法重置正则表达式索引,因此,您只能在锚定在开头的正面前瞻中使用捕获机制。前瞻将匹配字符串开头的空位置(由于^
),如果前一个返回 true(找到符合其模式的文本字符串),则上述正则表达式中的每个 tose 前瞻将一个接一个地执行。
您的正则表达式的工作方式不同,因为您匹配、使用带有.*
的文本(此子模式在前瞻之外)并重复字符串锚点的开头,如果您不使用多行修饰符,该锚点会自动使正则表达式失败。
为什么不直接使用捕获组来维护顺序。
^(?:(black)|(red)|(blue)|(green)|.)+$
这将匹配任何字符串,所有颜色都是可选的。
请参阅正则表达式 101 中的演示或 eval.in 中的 php 演示