【问题标题】:PHP Regexp (PCRE) - Find a set of all substringsPHP Regexp (PCRE) - 查找一组所有子字符串
【发布时间】:2011-07-11 00:42:46
【问题描述】:

我有如下字符串,例如:

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_ZZnnXXooYYuuXX_ ZZ

【问题讨论】:

  • 我之前也遇到过同样的问题。问题是试图找到重叠的,既不是贪婪的也不是非贪婪的工作。不过我不是正则表达式专家。
  • 尝试使用RegexBuddy open source alternatives 来设计匹配模式。
  • 这类似于这个问题:stackoverflow.com/questions/5163933/#5164444,但那是使用 .Net,而不是 PCRE。
  • 我会说我在另一个问题中所说的 - 如果模式很简单,或者开始/中间/结束模式不相关(即,.* 在它们之间,没有返回参考),您可以通过搜索所有XX、所有YY和所有ZZ来独立找到它们,并计算出所有组合。

标签: php regex pcre


【解决方案1】:

乍一看,这似乎很简单(如果我遗漏了什么,请道歉)。对于第一部分,使用重复匹配:

XX(.*?)YY(.*?)ZZ

对于更长的匹配,我建议单独匹配:

XX(.*?)YY(.*)ZZ

编辑

啊哈!模式重叠(谢谢大家)。在这种情况下,您将不得不循环。在重新尝试比赛之前,可能最容易去除任何领先的.*?XX。在 perl 土地上,你会使用

while (/XX(.*?)YY(.*?)ZZ/) {
    print "[$1] [$2]\n";
    s/^.*?XX//;
}

如果您迫切需要一个正则表达式,那么数组上下文中的m//g 将助您一臂之力。 (不确定相应的 php 可能是什么样子。)

@a = /XX(?=(.*?YY.*?ZZ))/g;

数组@a 将包含重叠的字符串,但去掉了最初的XX

【讨论】:

  • 您遗漏了一些东西 - 在我看来,这是意料之中的,因为这个问题非常令人困惑 - 示例中的第一个和第二个结果重叠:XXYYXX_ZZYYZZ 应该产生 2 i> 结果:XXYYXX_ZZXX_ZZYYZZ。您可以通过(?=XX(.*?)YY(.*?)ZZ) 获得这些信息,但并非针对所有可能的长度或所有可能性。
【解决方案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

有可能更优化吗?我不是正则表达式的专业人士。

【讨论】:

  • 很高兴听到它已排序。您可以通过单击此答案上/下箭头旁边的空心复选标记来接受您自己的答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2020-08-20
  • 2013-07-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多