2014-02-14 5 views
-1

Допустим, мы имеем следующее регулярное выражение:Статические группы захвата?

((a(.+?)c ?)+) 

Это будет соответствовать:

abc acc aac 

Что я хочу сделать:

((a(.+?)c ?)(a\3c ?)*) 

Так что я будет соответствовать только

abc abc abc 

или

acc acc acc 

но не пункт # 2 (а согласно ААСУ)

... Но без обратной ссылки.

В принципе, я хочу, чтобы третья группа захвата в # 1 (. +?) Всегда соответствовала бы тем, что было в первом матче.

Возможно ли это?

Чтобы сделать вещи более волосатыми, это должно работать в JavaScript-реджиксере.

+2

Вы хотите регулярное выражение ** без ** обратной ссылки? Потому что кажется, что backreference - это то, что вам нужно: '((a (. +?) C?) (A (. +?) C?) (A \ 3c?) *)' – acdcjunior

+0

yes, js поддерживает обратные ссылки и большинство другие функции perl regexp, из которых он основан ... – dandavis

+0

@ dandavis Просто протестировано, я этого не знал! Я всегда думал, что это не работает в _JavaScript_. Теперь вы открыли для меня целый новый мир _RegExp_ (не то, что я действительно использую его много над строковыми операциями) –

ответ

0

Вы не можете захватить конечное пространство, если оно варьируется, потому что запомненное значение будет буквально сравниваться в последующих ссылках. перемещение вариации вне захвата скобок делает его простым:

var rx= /(a(.+?)c) ?\1 ?\1/g ; 

// tests/demo 
"abc abc abc".match(rx) // ["abc abc abc"] 
"abc acc abc".match(rx) // null 
"abc acc aac".match(rx) // null 
"acc acc acc".match(rx) // ["acc acc acc"] 

так, это несколько дополнительных символов повторения, чтобы дополнительные места, но это работает.

+0

Я надеялся что-то найти * без обратной ссылки * – user3281506

+0

не уверен, что я понимаю, основываясь на ваших примерах. вы хотите жестко закодировать другой RegExp для «abc abc abc», чем для «abc acc abc»? вы перечислите несколько комбинаций и, чтобы покрыть их все, потребуется много объектов RegExp ... – dandavis

+0

Второе регулярное выражение делает именно то, что я хочу, но я хочу знать, можно ли сделать это без обратной ссылки. Он также должен соответствовать «adc adc adc» или «axc axc axc», но средний символ (независимо от того, что он есть) должен быть одинаковым в каждом повторении. Я также должен отметить, что это не точный regexp, который я пытаюсь построить, а скорее упрощенная версия. – user3281506

Смежные вопросы