PHP Regex(PCRE) - 查找所有子串的集合

时间:2011-03-08 10:55:30

标签: php regex pcre

我有以下字符串,例如:

aaXXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZvv

如何找到字符串中的所有XX.*YY.*ZZ部分? (可能使用preg_match()

  • XX cc YY eeXX_ ZZ
  • XX _ ZZkk YY mmXX _ ZZ
  • XX _ ZZnnXXoo YY uuXX _ ZZ
  • XX oo YY uuXX_ ZZ

加上所有更长的比赛,如:

  • XX cc YY eeXX_ZZkkYYmmXX_ZZnnXXooYYuXX_ ZZ

2 个答案:

答案 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被剥离。