javascript-正则表达式-重复标签匹配综合症

时间:2019-06-28 00:41:09

标签: javascript regex

试图弄清楚这两种情况之间的区别对我来说很奇怪

情况1:

2组比赛

var reg = /@([a-zA-Z]+)\((.*)\)/;
var text = ' @ifblank(1, @ifblank(2, 3) ) ';

text.match(reg);

结果(符合预期)

match 1: "ifblank"
match 2: "1, @ifblank(2, 3) "

情况2:

3组比赛

var reg = /@([a-zA-Z]+)\((.*), (.*)\)/;
var text = ' @ifblank(1, @ifblank(2, 3) ) ';

text.match(reg);

结果(不符合预期)

match 1: "ifblank"
match 2: "1, @ifblank(2"
match 3: "3) "

我期望的是:

match 1: "ifblank"
match 2: "1"
match 3: "@ifblank(2, 3)"

我之所以这样认为是因为我在一种格式中使用了相同的标签,但是如何创建预期的结果?

2 个答案:

答案 0 :(得分:2)

如果您的第一个索引只有数字,即您想要的位置

比赛2:“ 1”

然后您可以将正则表达式更改为

var reg = / @([a-zA-Z] +)((\ d),(。*))/;

答案 1 :(得分:1)

对于第二组,不要使用.*来匹配任何内容,而应使用[^,]+来匹配除逗号以外的任何内容:

@([a-zA-Z]+)\(([^,]*), (.*)\)
               ^^^^

https://regex101.com/r/uyfoqq/2

如果需要,还可以通过要求匹配的最后一个字符为\S(非空白字符)来修剪第三组末尾的空格:

@([a-zA-Z]+)\(([^,]*), (.*\S) *\)
                          ^^ ^^

https://regex101.com/r/uyfoqq/3