我有以下字符串,例如:
aaXXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZvv
如何找到字符串中的所有XX.*YY.*ZZ
部分? (可能使用preg_match()
)
加上所有更长的比赛,如:
答案 0 :(得分:2)
感谢大家的帮助。
我的解决方案基于'bobbogo'解决方案。谢谢。
正则表达式:
(?=(XX.*?YY.*?ZZ))(?=(.*ZZ))
结果(来自RegexBuggy):
1 XXccYYeeXX_ZZ XXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZ
2 XX_ZZkkYYmmXX_ZZ XX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZ
3 XX_ZZnnXXooYYuuXX_ZZ XX_ZZnnXXooYYuuXX_ZZ
4 XXooYYuuXX_ZZ XXooYYuuXX_ZZ
可能通过更优化吗?我在正则表达式方面不是很专业。
答案 1 :(得分:1)
乍一看这似乎很直接(如果我遗漏了某些东西,道歉)。对于第一部分,使用重复匹配:
XX(.*?)YY(.*?)ZZ
对于较长的比赛,我建议单独匹配:
XX(.*?)YY(.*)ZZ
修改强>
啊哈!模式重叠(感谢大家)。在这种情况下,您将不得不循环。在重新尝试比赛之前,可能最容易剥离任何前导.*?XX
。在perl land你会用
while (/XX(.*?)YY(.*?)ZZ/) {
print "[$1] [$2]\n";
s/^.*?XX//;
}
如果您迫切希望使用单个正则表达式,那么阵列上下文中的m//g
将为您提供帮助。 (不确定对应的php可能是什么样的。)
@a = /XX(?=(.*?YY.*?ZZ))/g;
数组@a
将包含重叠的字符串,但最初的XX
被剥离。