在较大的正则表达式中使用一组parens进行多次捕获

时间:2009-03-25 20:49:58

标签: javascript regex

我有一个正则表达式(javascript),就像......

/(X)(Y)+(Z)/ GI

问题在于,即使(y)+匹配多次,我也总能从这些parens中获得3次捕获。如果它匹配多次,则只返回最后一个匹配。我无法提前知道y在任何给定的运行中会匹配多少次,但我想捕获所有这些。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

我会用

/(x)(y+)(z)/gi

然后获取与第二组匹配的文本并进一步解析。

答案 1 :(得分:3)

我认为你不能使用

/(x)((?:y)+)(z)/gi

因为这是“更大的正则表达式”的一部分吗?

答案 2 :(得分:2)

移动括号内的+,然后将y拆分为各个部分。以下是Perl,但它应该给你一个想法:

#!/usr/bin/perl

use strict;
use warnings;

my $s = "abcbcbcd";

my ($x, $y, $z) = $s =~ /(a)((?:bc)+)(d)/;

my @y = $y =~ /(bc)/g;

print "x is $x\n",
    "y is ", join(", ", @y), "\n",
    "z is $z\n";

这里有一些糟糕的Javascript我一起入侵(我真的不懂Javascript):

<html>
<body>

<script type="text/javascript">
var str = "abcbcbcd"; 
var matches = str.match(/(a)((?:bc)+)(d)/);
var x = matches[1];
var y = matches[2].match(/(bc)/g);
var z = matches[3];

document.write(
    "x is ", x, "<br />",
    "y is ", y.join(", "), "<br />",
    "z is ", z
);
</script>

</body>
</html>