我有一个正则表达式(Javascript),大概是这样的...
/(x)(y)+(z)/gi /(x)(y)+(z)/gi
问题在于,即使(y)+多次匹配,我始终只能从那些括号中获得3个捕获。如果它确实匹配多次,它只会返回最后一次匹配。我无法预先知道y将在任何给定运行中匹配多少次,但我希望捕获所有这些。
有什么想法吗?
我有一个正则表达式(Javascript),大概是这样的...
/(x)(y)+(z)/gi /(x)(y)+(z)/gi
问题在于,即使(y)+多次匹配,我始终只能从那些括号中获得3个捕获。如果它确实匹配多次,它只会返回最后一次匹配。我无法预先知道y将在任何给定运行中匹配多少次,但我希望捕获所有这些。
有什么想法吗?
我会使用
/(x)(y+)(z)/gi
然后取匹配第二组的文本,并进一步解析它。
我理解你不能用。
/(x)((?:y)+)(z)/gi
因为这是“更大的正则表达式”的一部分?
将加号移至括号内部,然后将 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
",
"y is ", join(", ", @y), "
",
"z is $z
";
这里有一些我凑合着写的垃圾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>