控件正则表达式为空匹配项


Control regex empty matches

我正试图从一个相当简单的字符串中提取匹配项。在我的输入字符串中,一般模式为: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,''}]

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

除了一个简单的工作解决方案外,解释一下我的误解也很好。

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

试试这个:

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

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

我添加了一个前瞻性检查,以检查在字符串后面或:或末尾是否有另一个"s''d"。

编辑:由于"s"不允许出现在第二个捕获组中,您可以简单地写:

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

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