【问题标题】:Find all substrings within a string with overlap查找字符串中重叠的所有子字符串
【发布时间】:2017-08-05 14:48:15
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您正在使用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,那么,关于此需要说明三件事:

    1. 这对于正则表达式来说基本上是不可避免的。
    2. 你真的不应该计算两次,因为它是重叠的。这不是模式的真正重现。
    3. 也就是说,如果你想计算两次,你可以这样做:

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

      输出:

      4
      

      Demo

    【讨论】:

    • 但我也需要重叠的 ACA,这也是我的问题
    • //TT在TTT中出现两次!
    • @lolsharp (?=...) 是所谓的“积极前瞻断言”。它的意思是,“看看接下来是不是xyz,但不要移动光标。”它使我们能够找到您拥有ACA(或任何$needle)的每个位置,而无需“消耗”这三个字符。下一个匹配只能是一个字符。
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 2012-04-20
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多