2010-01-14 4 views
2

Имея следующее регулярное выражение:RegEx Обратные

([a-z])([0-9])\1 

Это соответствует a5a, есть ли способ для того, чтобы также соответствовать a5b, a5c, a5d и так далее?


EDIT: Хорошо, я понимаю, что я мог бы просто использовать ([a-z])([0-9])([a-z]) но у меня очень длинный и сложный регулярное выражение (соответствие суб-суб-суб -...- доменов или соответствия адрес IPv4), который действительно выиграет от описанного выше поведения. Можно ли как-то достичь обратных ссылок или чего-то еще?


Anon. answer является то, что мне нужно, но это, кажется ошибочным.

ответ

2

Вам не нужны обратные ссылки, если вторая буква не зависит от первой, правильно?

([a-z])([0-9])([a-z])+ 

EDIT

Если вы просто не хотите, чтобы повторить последнюю часть снова и снова, то:

([a-z])([0-9])([a-z]) 

Просто убирая '+'.

+0

Спасибо Бран, но, пожалуйста, проверьте мои изменения. –

+0

Нет, я хочу иметь эффект первого регулярного выражения, которое вы предоставили '([a-z]) ([0-9]) ([a-z]) +', но без повторения последней части снова и снова. –

0

Я не следую вашему вопросу?

[a-z][0-9][a-z] Exactly 1 
[a-z][0-9][a-z]? One or 0 
[a-z][0-9][a-z]+ 1 or more 
[a-z][0-9][a-z]* 0 or more 
+0

Можете ли вы проверить мое редактирование? Благодарю. –

2

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

Чтобы получить нужное поведение, чтобы позднее можно было повторно использовать часть регулярного выражения, вы можете просто определить части регулярного выражения, которое вы хотите повторно использовать в отдельной строке, и (в зависимости от языка, который вы 're working in) используют строчную интерполяцию или конкатенацию для создания регулярного выражения из фрагментов.

Например, в Ruby:

>> letter = '([a-z])' 
=> "([a-z])" 
>> /#{letter}([0-9])#{letter}+/ =~ "a5b" 
=> 0 
>> /#{letter}([0-9])#{letter}+/ =~ "a51" 
=> nil 

Или в JavaScript:

var letter = '([a-z])'; 
var re = new RegExp(letter + '([0-9])' + letter + '+'); 
"a5b".match(re) 
1

Я подозреваю, что Вы желаете что-то похожее на Perl (?PARNO) конструкции (это не только для рекурсии;).

/([a-z])([0-9])(?1)+/ 

будет соответствовать тому, что вы хотите - и любые изменения в первой группе захвата будет отражено в чем (?1) матчах.

+0

Кажется, что я ищу, но регулярное выражение, которое вы предоставили, дает мне ошибки в RegexBuddy (в режиме PCRE и Perl). –

+0

Работает в моей версии Perl. –

+0

'(? 1)' часть регулярного выражения дает мне следующую ошибку в RegexBuddy в режиме Perl: ** Ошибочные символы (возможно, неполный токен регулярного выражения или неэкранированные метасимволы) **, в любом случае. =) –

3

Ответ не с обратными ссылками

означает, обратная ссылка совпадает со значением, которое было ранее найденным. Это не означает соответствия предыдущему выражению.Но если ваш язык позволяет это, вы можете подставить переменную в строку в свое выражение перед ее компиляцией.

Tcl:

set exp1 "([a-z])" 
regexp "${exp1}([0-9])${exp1}+" $string 

Javascript:

var exp1 = '([a-z])'; 
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+'); 
string.match(regexp); 

Perl:

my $exp1 = '([a-z])'; 
$string =~ /${exp1}([0-9])${exp1}+/; 
0

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

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

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

  • Нет связанных вопросов^_^