在PCRE中捕获未知重复模式

3
这可能是一道对于有经验的正则表达式使用者来说比较简单的问题,但我在执行匹配时遇到了困难。
假设我有一个像这样的字符串:
http://aaa-bbbb-cc-ddddd-eee-.sub.dom

我希望能够捕获所有的"aaa"、"bbbb"、"cc"和"ddddd"子字符串,但我不确定会有多少个(例如,是否包含所有的三元组直到"zzz")。

这是我现在尝试使用的正则表达式:

/http:\/\/(\w*?\-)+\.sub\.dom/

我这样写的原因是:
  1. 我想匹配子字符串,但我希望每个子字符串在解析到一个“-”时终止。
  2. 我想捕获一个或多个这样的子字符串。
但似乎它只保存了最后一个匹配项(在上面的例子中,它只会匹配“eee-”)。
有没有好的方法来捕获所有匹配的子字符串?
更多信息:我正在使用PHP的PCRE函数preg_replace_callback。谢谢!
2个回答

5

不,无法匹配未知数量的捕获组。

如果尝试重复捕获组,它将始终包含最后一个捕获的值。

您能否更广泛地解释一下您想要做什么?也许有另一种简单的方法可以实现(可能不需要使用正则表达式)。


这是非常有用的信息,我自己都快要疯了。我正在尝试将整个域名转换为一个仅包含子域名的字符串,其中连字符被替换为下划线。我可以使用str_replace很简单地完成它,但我希望能够通过正则表达式实现一次性解决方案。 - Ryan

2
如果您想要子域中的项目,然后匹配连字符之间的所有内容... 这应该可以起作用:
$string = "http://aaa-bbbb-cc-ddddd-eee-.sub.dom";

preg_match("/^http:\/\/([\w-]+?)\..*$/i", $string, $match);

$parts = explode('-', $match[1]);

print_r($parts);

如果这无法满足您的需求,您可能需要构建一个小型解析脚本来自己解析字符串。


那将最终实现我想要的。唉,我本来希望正则表达式能在这里发挥作用,但我想我们受限于这里所要求的在最坏情况下不是有限状态的限制。 - Ryan
1
正则表达式无法捕获重复模式,这与尝试使用正则表达式解析HTML的问题相同,它根本不起作用。 - sg3s

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