问题:(非)贪婪正则表达式

3

考虑以下字符串:

1: cccbbb

2: cccaaabbb

我希望最终得到的匹配结果类似于这样:
1: Array
(
    [1] => 
    [2] => bbb
)

2: Array
(
    [1] => aaa
    [2] => bbb
)

我该如何在一个正则表达式中匹配两个条件?
这是我的尝试:

#(aaa)?(.*)$#

我已经尝试了许多贪婪和非贪婪的修改,但是都没有成功。一旦我添加'?',[2]中的所有内容都会被匹配。使[2]变成非贪婪也没有帮助。

如果我省略'ccc',我的正则表达式将按预期工作,但我必须允许其他字符出现在开头...


你能否更明确地指定第二部分,而不仅仅是使用 .*?也许可以用 b* - Gumbo
很遗憾,我只知道第一个aaa应该与[1]相匹配。 - samy-delux
可以不指定,只是不能包含aaa。我尝试了其他与匹配ccc相关的正则表达式变体,但都没有成功。 - samy-delux
你能描述一下 ccc 部分吗?如果不能,那么在第一种情况下如何仅获取 bbb 而不包含 ccc? - ZyX
@samy-delux:但是cccbbb也不包含aaa - Gumbo
显示剩余2条评论
5个回答

3
/(aaa)?((.)\3*)$/

不过会有额外的[3]。我认为这不是问题。


这似乎有效!您介意解释一下 (.)\3* 部分的作用吗? - samy-delux
@samy: (.) 匹配任何字符(除了\n)。这里有3个捕获括号,(.) 是第三个。\3* 部分表示零个或多个“东西”,它与第三个匹配相同。因此,基本上 (.)\3* 意味着一个或多个任意但相同的字符。 - kennytm
我刚刚意识到这也不是。bbb 可以包含不同的字符。bbb 可能不是一个好的例子。 - samy-delux

1

感谢大家在这里的头脑风暴!我终于能够找到一个可行的解决方案:

^(?:([^a]*)(aaa))?(.*)$

但它并没有做你想要的事情。在你的示例1中,\1将包含cccbbb;在你的示例2中,\1包含ccc\2包含aaa\3包含bbb。你真正想做什么? - Tim Pietzcker
不,例如1中,使用该RegExp,\3将包含cccbbb\1只能与\2结合使用,请尝试一下。 - samy-delux
这个怎么能够匹配 cccbbb 中的 bbb 呢? - kennytm

0
这是一种非正则表达式的方法。如果找到了"aaa",则在其上进行搜索和分割,然后将"aaa"右侧的其余部分存储到数组中。
$str="cccaaabbb";
if (strpos($str,"aaa")!==FALSE){
   $array[]="aaa";
   $s = explode("aaa",$str);
   $array[]=end($s);
}
print_r($array);

输出

$ php test.php
Array
(
    [0] => aaa
    [1] => bbb
)

关于[1],取决于当未找到"aaa"时的标准,可以简单地使用strpos()从第4个字符开始获取子字符串。


0

这将匹配组,但不是非常灵活。你能否提供更多需要做的细节?每次获取三个字符并评估它们可能会更容易。

此外,我在PowerShell中测试了这个正则表达式,它有稍微不同的风格。

(a{3,3})*(b{3,3})


0

像这样做:

$sPattern = "/(aaa?|)(bbb)/";

这个运行得很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接