我想做一些类似的问题组合?偶数重叠,并找到所有匹配的给定模式,即使它们重叠(例如,匹配字符串ABABA和模式ABA应该返回2个匹配,而不仅仅是第一个)。
但是我有一个额外的限制:我的模式可以以一个重复的说明符结束。让我们以+为例:这意味着模式/A+/和subject "AA"应该返回3个匹配:
"AA""A""A"以下模式基于对上述问题提出的解决方案,无法匹配所有三个结果:
/(?=(A+))/只找到前两个匹配,但没有找到最后一个匹配。/(?=(A+?))/只找到最后两个匹配,但没有找到第一个匹配。我现在唯一的解决办法是保留贪婪的版本,并尝试对每个匹配对象应用模式减去其最后一个字符,重复此操作,直到它不再匹配为止,例如:
$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或类似的?
发布于 2016-11-20 19:40:13
您希望在一个索引上获得多个匹配,这是不可能的1正则匹配操作。你真的需要
见PHP演示
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 )https://stackoverflow.com/questions/40707282
复制相似问题