是否可以让RegEx回落到字符串的开头并再次开始匹配?
这就是我问的原因。给定以下字符串,我想按顺序捕获子字符串-t
,black
,red
和blue
,而不管其中的出现顺序如何主题字符串,并且仅当主题字符串中存在所有子字符串时。
green
因此,对于以下所有字符串,RegEx应捕获$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))
和前瞻不会这样做。
是否可以构建这样的RegEx?
对于上下文,我将在PHP中使用RegEx。
答案 0 :(得分:3)
您可以使用
^(?=.*(black))(?=.*(red))(?=.*(blue))(?=.*(green))
注意:这将要求所有这些关键字都在字符串中。
请参阅demo
匹配时无法重置RegEx索引,因此,您只能在开始时锚定的正向前瞻中使用捕获机制。前瞻将匹配字符串开头的空位置(由于^
),并且如果前一个返回true,则上面的RegEx中的每个前瞻将一个接一个地执行(找到一串文本会议它的模式)。
您的RegEx不能以相同的方式工作,因为您匹配,使用.*
消耗了该文本(此子模式位于前瞻之外)并重复了字符串锚点的开始,如果您不使用,则会自动使RegEx失败多线修饰符。
答案 1 :(得分:1)