问题(in-)贪婪的RegEx

时间:2010-02-28 14:38:19

标签: php regex parsing string

考虑以下字符串:

1: cccbbb

2: cccaaabbb

我想最终得到像这样的比赛:

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

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

如何在一个RegExp中匹配两者?
这是我的尝试:

#(aaa)?(.*)$#

我已经尝试了许多贪婪和不合理的修改变体,但它没有成功。我一添加'?'一切都在[2]中匹配。制作[2] ungreedy并没有帮助。

如果我省略'ccc',我的RegExp会按预期工作,但我必须在开头允许其他字符...

5 个答案:

答案 0 :(得分:3)

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

虽然会有额外的[3]。我不认为这是一个问题。

答案 1 :(得分:1)

感谢大家的头脑风暴!我终于能够找到有用的东西了:

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

答案 2 :(得分: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开始获取子串一样简单。

答案 3 :(得分:0)

这将与小组相匹配,但它不是很灵活,你可以更详细地说明你需要做什么。一次抓取三个字符并评估它们可能要容易得多。

此外,我在poweshell中对此进行了测试,其中正则表达式略有不同。

(一个{3,3})*(B {3,3})

答案 4 :(得分:0)

这样做:

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

这很有效。