首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与preg_match_all重叠匹配和以重复字符结尾的模式

与preg_match_all重叠匹配和以重复字符结尾的模式
EN

Stack Overflow用户
提问于 2016-11-20 17:47:05
回答 1查看 366关注 0票数 3

我想做一些类似的问题组合?偶数重叠,并找到所有匹配的给定模式,即使它们重叠(例如,匹配字符串ABABA和模式ABA应该返回2个匹配,而不仅仅是第一个)。

但是我有一个额外的限制:我的模式可以以一个重复的说明符结束。让我们以+为例:这意味着模式/A+/和subject "AA"应该返回3个匹配:

  • 匹配从索引0开始的"AA"
  • 匹配从索引1开始的"A"
  • 匹配从索引0开始的"A"

以下模式基于对上述问题提出的解决方案,无法匹配所有三个结果:

  • 模式/(?=(A+))/只找到前两个匹配,但没有找到最后一个匹配。
  • 模式/(?=(A+?))/只找到最后两个匹配,但没有找到第一个匹配。

我现在唯一的解决办法是保留贪婪的版本,并尝试对每个匹配对象应用模式减去其最后一个字符,重复此操作,直到它不再匹配为止,例如:

代码语言:javascript
复制
$all_matches = array ();
$pattern = 'A+';

preg_match_all("/(?=($pattern))/", "AA", $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    do {
        $all_matches[] = $match[1];
        $subject = substr($match[1], 0, -1);
    }
    while (preg_match("/^($pattern)/", $subject, $match));
}

是否有任何更好的解决方案来实现这一点使用preg_match_all或类似的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-20 19:40:13

您希望在一个索引上获得多个匹配,这是不可能的1正则匹配操作。你真的需要

  • 从字符串中查找所有子字符串的组合
  • 只保留那些完全符合你的模式。

PHP演示

代码语言:javascript
复制
function find_substrings($r, $s) {
  $res = array();
  $cur = "";
  $r = '~^' . $r . '$~';
  for ($q = 0; $q < strlen($s); ++$q) {
    for ($w = $q; $w <= strlen($s); ++$w) {
        $cur = substr($s, $q, $w-$q);
        if (preg_match($r, $cur)) {
            array_push($res, $cur);
        }
    }
  }
  return $res;
}
print_r(find_substrings("ABA", "ABABA"));
// => Array ( [0] => ABA [1] => ABA )
print_r(find_substrings("A+", "AA"));
// => Array ( [0] => A [1] => AA [2] => A )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40707282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档