查找具有重叠的字符串中的所有子字符串
Find all substrings within a string with overlap
您好,我正在尝试查找字符串中所有重叠的子字符串,这是我的代码,它只查找非重复 ACA。
$haystack = "ACAAGACACATGCCACATTGTCC";
$needle = "ACA";
echo preg_match_all("/$needle/", $haystack, $matches);
您正在使用 echo
打印 preg_match_all
的 return 值。也就是说,您只显示找到的匹配项数。你可能想要做的是 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
)
)
如果您真正关心的是它只计算了 ACACA
一次,那么,关于这一点需要说明三点:
- 这基本上是正则表达式不可避免的。
- 你真的不应该计算两次,因为它是重叠的。这不是模式的真正重现。
就是说,如果你想计算两次,你可以这样做:
echo preg_match_all("/(?=$needle)/", $haystack, $matches);
输出:
4
这里是一个脚本,用于查找子字符串的所有出现,以及重叠的。
$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);
输出:Array ( 0, 5, 7, 14 )
您好,我正在尝试查找字符串中所有重叠的子字符串,这是我的代码,它只查找非重复 ACA。
$haystack = "ACAAGACACATGCCACATTGTCC";
$needle = "ACA";
echo preg_match_all("/$needle/", $haystack, $matches);
您正在使用 echo
打印 preg_match_all
的 return 值。也就是说,您只显示找到的匹配项数。你可能想要做的是 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
)
)
如果您真正关心的是它只计算了 ACACA
一次,那么,关于这一点需要说明三点:
- 这基本上是正则表达式不可避免的。
- 你真的不应该计算两次,因为它是重叠的。这不是模式的真正重现。
就是说,如果你想计算两次,你可以这样做:
echo preg_match_all("/(?=$needle)/", $haystack, $matches);
输出:
4
这里是一个脚本,用于查找子字符串的所有出现,以及重叠的。
$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);
输出:Array ( 0, 5, 7, 14 )