簡體   English   中英

查找具有重疊的字符串中的所有子字符串

[英]Find all substrings within a string with overlap

您好,我正在嘗試查找字符串中所有重疊的子字符串,這是我的代碼,它只查找非重復的 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);

Output:

Array
(
    [0] => Array
        (
            [0] => ACA
            [1] => ACA
            [2] => ACA
        )

)

演示

如果你真正關心的是它只計算了一次ACACA ,那么,關於這一點需要說明三點:

  1. 這基本上是正則表達式不可避免的。
  2. 你真的不應該計算兩次,因為它是重疊的。 這不是模式的真正重現。
  3. 也就是說,如果你想計算兩次,你可以這樣做:

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

    Output:

     4

    演示

這是一個腳本,用於查找 substring 的所有出現,以及重疊的出現。

    $haystack = "ACAAGACACATGCCACATTGTCC";
    $needle   = "ACA";

    $positions    = [];
    $needle_len   = strlen($needle);
    $haystack_len = strlen($haystack);

    for ($i = 0; $i <= $haystack_len; $i++) {
        if( substr(substr($haystack,$i),0,$needle_len) == $needle){
            $positions[]=$i;
        }
    }
    print_r($positions);

Output: Array ( 0, 5, 7, 14 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM