具有反向引用的正则表达式作为重复计数

时间:2015-04-19 10:30:45

标签: regex

有没有办法构建一个可以按如下方式工作的正则表达式:

  

将整数与组1匹配,然后匹配\1整数。

(\d+)(\s+\d+){\1}这个{{1}}是不允许的,但我发现它很好地描述了我想要实现的目标。

2 个答案:

答案 0 :(得分:2)

你可以做这样的事情

var numbers = "3 7 6 5 4 3 2 1"; // list of numbers
var iter = numbers.split(" ")[0] // get first number
numbers = numbers.substr(iter.length+1) // chop off first number, and the space that follows it you can comment
var rex = new RegExp("(?:\\d(?: |$)){" + iter + "}","") // create regex
alert((numbers.match(rex)||[]).join("\n")) // a sample alert that joins the array to a string with an element on each line

或者,如果您想要第一个数字来定义同一个数组中出现的次数,那么可以进行一些更改

var numbers = "3 7 6 5 4 3 2 1"; // list of numbers
var iter = numbers.split(" ")[0] // get first number
var rex = new RegExp("(?:\\d(?: |$)){" + (+iter+1) + "}","") // create regex
alert((numbers.match(rex)||[]).join("\n")) // a sample alert that joins the array to a string with an element on each line

答案 1 :(得分:0)

感谢@Kobi提出使用代码标注的建议。确实有可能使用最后一个反向引用来建立动态长度匹配。代码看起来像这样:

$s = '3 4 5 6 7 8 9 10';
$s =~ /(\d+)\s+((??{"(\\s*\\d+){$^N}"}))/;
print "$1\n$2\n"

打印

3
4 5 6