回退到正则表达式中字符串的开头


Fall back to begining of string in RegEx

是否可以让正则表达式回退到字符串的开头并再次开始匹配?

这就是我问的原因。给定下面的字符串,我想按该顺序捕获子字符串blackredbluegreen,无论主题字符串中的出现顺序如何,并且仅当所有子字符串都存在于主题字符串中时。

$str ='blue-ka93-red-kdke3-green-weifk-black'

因此,对于以下所有字符串,正则表达式应捕获blackredbluegreen(按此顺序)

'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 演示