2013-09-14 2 views
1

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

2-регулярное выражение ищут так:

[email protected]*/(\d\.\d\.\d)/@Version: $1/@g 
[email protected]*/(\d\.\d)/@Version: $1.0/@g 

Я пытаюсь его

[email protected]*/(\d\.\d)(\.\d)?(?(2)|\.0)/@Version $1$2$3/@g 

, но он не работает. Я понял условности неправильно? Некоторые номера версий имеют только 2 цифры, а те, которые я хочу добавить в ".0".

+0

Я не думаю, что вы можете сделать это. Вы должны соответствовать '.0' в условии, чтобы он мог что-то захватить. – Jerry

ответ

2

У вас есть небольшая проблема в вашем регулярном выражении:

[email protected]*/(\d\.\d)(\.\d)?(?(2)|\.0)/@Version $1$2$3/@g 
        ^^^^^^^^^^ 

Часть I подчеркнуты интерпретируется как это на Perl: Если бы я захватил что-то в группе № 2, то ничего не делать, иначе пытаться соответствовать точке ., а затем 0.

Это не то, что вы ожидаете, другими словами, оно не фиксирует .0 в собственной группе.

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

s/(\d\.\d)(\.\d)?/'@Version ' . $1 . ($2?$2:'.0')/ge; 

Это по существу говорит, что если бы вы были в состоянии соответствовать группе 2 $2? затем положить $2 в строке замены, иначе ставить .0 как этот :'.0'.

Perl оценивает заменяемую строку как код Perl, так что оператор . является оператором конкатенации.

Codepad Demo

+0

Спасибо за ваш ответ, я еще не нашел/e, похоже, отсутствует на http://perldoc.perl.org/perlre.html, похоже, что программное обеспечение не может обрабатывать/e, из источника: переключатель (optstring [i]) { case 'e': break;/* ToDo ;-) */ – Sebastian

+0

@Sebastian Я только что изменил свой ответ, проверьте правку. Я также включил онлайн-демонстрацию. –

+0

@Sebastian Проверьте этот [link] (http://perldoc.perl.org/perlreref.html) и немного, чтобы увидеть модификатор 'e'. –

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