正则表达式使用多个值命名捕获组

时间:2010-12-14 16:31:43

标签: regex

我似乎有一个艰难的正则表达周。任何可以让我免于将笔记本电脑扔到窗外的人都可以获得虚拟啤酒。我有以下形式的一些数据:

... f=something group="First Group,Group2" foo=val ...

其中组的数量可以变化。我需要将每个组条目捕获到命名捕获。基于previous post,这里的区别在于我没有一个常数来键入值(即ID-1-1,ID-2-2允许我说ID- \ d + - \ d +而这些值几乎可以是任何东西)。我一直在尝试很多东西,但我倾向于得到太贪婪的比赛,或者我(经常)得到这两个值:

First Group
First Group,Group2

我需要的是:

First Group
Group2
...

我正在尝试使用这样的正则表达式,我试图锚定到group =“部分,而不是超过结尾”:

(?:(?:group=\")|(?:\"))(?<group>(?:(.+)+?)

希望有人可以让我的日子变得更好......

1 个答案:

答案 0 :(得分:2)

这是PHP解决方案。再一次,正则表达式不喜欢捕获多个值,因此我们需要将其分解为两次搜索。一个提取组值,下一个提取组中的每个值

$test = 'f=something group="First Group,Group2" foo=val';
$re = '/(?:group=)?\x22(?<group>(?:[^\x2C]+\x2C*)+)\x22/';
$_ = null;
if (preg_match($re,$test,$_))
  echo "Group Contents: ".$_['group']."\r\n";

$__ = null;
$re = '/(?:^|\x2C)(?<value>(?:[^\x2C]+)+)/';
if (preg_match_All($re,$_['group'],$__))
  echo "Group Values: ".print_r($__['value'],true);

移植到另一种语言应该很容易,只需提取正则表达式并按照通常的方式管理它们。