控制正则表达式空匹配

时间:2013-11-25 18:07:44

标签: php regex

我试图从一个相当简单的字符串中拉出匹配。在我的输入字符串中,常规模式为:s(definitely a number)e(maybe some characters)s...

示例输入:s1e1s2e2s3es4e4

预期匹配数组:[{1,1},{2,2},{3,''},{4,4}]

我试过了:

/s(\d)e([\d\:]+)?/g并获得非常接近的[{1,1},{2,2},{3},{4,4}],但我需要第三组中的空字符串。

我天真地尝试

/s(\d)e(.*?)?/g给了我[{1,''},{2,''},{3,''},{4,''}]

我宁愿告诉正则表达式匹配任何字符,而不是在第一个例子中使用字符类。

除了一个简单的工作解决方案之外,对我的误解的解释也会很棒。

3 个答案:

答案 0 :(得分:2)

preg_match_allPREG_PATTERN_ORDER选项一起使用(默认设置)。然后它不会遗漏与结果中的任何内容都不匹配的可选组。

答案 1 :(得分:1)

试试这个:

$pattern = '~s(\d)e([\d\:]*?(?=s\d|:|$))~';

现在你的捕获组可以匹配一个空字符串,不再是可选的。

我添加了一个预测,以检查是否有另一个“s \ d”或:或字符串结尾。

编辑:由于第二个捕获组中不允许使用“s”,因此您只需编写:

$pattern = '~s(\d)e([^s]*)~';

答案 2 :(得分:0)

我认为这个s(\d)e(\d|)应该适用于您的示例。我不知道结肠是为了什么。