php - 查找字符串中重叠的所有子字符串

标签 php regex preg-match-all substring overlapping-matches

嗨,我试图在一个字符串中找到所有重叠的子字符串,这是我的代码,它唯一找到了非重复的 ACA。

$haystack = "ACAAGACACATGCCACATTGTCC";
$needle = "ACA";
echo preg_match_all("/$needle/", $haystack, $matches);

最佳答案

您正在使用 echo打印 preg_match_all 的返回值.也就是说,您只显示找到的匹配项数。您可能想要做的是类似 print_r($matches); 的事情。 , 像这样:

$haystack = "ACAAGACACATGCCACATTGTCC";
$needle = "ACA";
preg_match_all("/$needle/", $haystack, $matches);
print_r($matches);

输出:
Array
(
    [0] => Array
        (
            [0] => ACA
            [1] => ACA
            [2] => ACA
        )

)

Demo

如果您真正关心的是它计数 ACACA只有一次,嗯,有三件事需要说:
  • 这对于正则表达式来说基本上是不可避免的。
  • 你真的不应该计算两次,因为它是重叠的。这不是模式的真正重现。
  • 也就是说,如果你想计算两次,你可以这样做:
    echo preg_match_all("/(?=$needle)/", $haystack, $matches);
    

    输出:
    4
    

    Demo
  • 关于php - 查找字符串中重叠的所有子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42800017/

    相关文章:

    javascript - 正则表达式,选择链接从空格开始,但从选择中排除空格

    PHP preg_match_all 在匹配项上运行 php 函数

    asp.net - 在 MVC 中使用正则表达式同时检查空和数字输入

    php - 用于提取不带空格的哈希标签的正则表达式

    php - 为什么 preg_match_all 返回两个匹配项?

    php - 输入未在 symfony 和 formbuilder 上提交

    php - 是否可以使用 Google Maps API v3 的 map.getBounds() 的结果来查询 MySQL 数据库?

    php - Left Join After Where 子句

    php - 仅查找连接条件匹配的 parent

    正则表达式:尝试匹配两个字符串*之间没有*某个字符