2015-04-19 2 views
8

Есть ли способ, чтобы построить регулярное выражение, которое будет работать следующим образом:Regex с обратной ссылкой, как счетчик повторений

Match целым как группы 1, то совпадают \1 целых чисел.

Этот (\d+)(\s+\d+){\1} несчастливо не допускается, но я нахожу это хорошим описанием того, что я пытаюсь достичь.

+4

что язык, который вы используете? –

+6

Это, как правило, крайне не поддерживается. Вероятно, это возможно с помощью [кодовое обозначение кода] (http://perldoc.perl.org/perlretut.html#A-bit-of-magic:-executing-Perl-code-in--regular-expression), но это функция, которую некоторые люди не любят (вам следует беспокоиться, когда Perl RE docs говорят «Немного волшебства»). Вы могли бы также написать два шаблона: получить номер, проанализировать его и построить второй шаблон (или запустить '\ s + \ d +' 'n' раз). – Kobi

+2

@Kobi Это может быть anwer – hek2mgl

ответ

1

Вы можете сделать что-то вроде этого

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 
Смежные вопросы