2012-09-24 3 views
0

У меня есть следующие строки случай:Perl: Regex соответствие дополнительных строк

  • моего $ ул = "Warehouse.13.s01e01.hdtv.xor.avi";
  • my $ str = "Warehouse.13.01x01.hdtv.xor.avi";
  • my $ str = "Warehouse.13.season01episode01.hdtv.xor.avi";

Разделитель (.) в вышеуказанных случаях может быть заменен на _ - \s. Теперь, чтобы соответствовать выше случаям я создал следующее регулярное выражение, и он прекрасно работает:

my $regex_object = qr{.*?\d{1,2}(?:e|edosipe)?[._\- x]?\d{1,2}(?:s|nosaes)?[._\- ]?(?=\d+)(.*)}; 

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

Теперь для вышеуказанных случаев выход Warehouse 13, который является моим требуемым выходом.

Проблемы теперь, если мой series name не содержит numbers(13,24) Я не хочу, чтобы мое выше регулярное выражение, чтобы соответствовать и, чтобы убедиться, что я использовал (?=\d+) я, е, если s|season предшествует номер или нет.

Теперь, если мой $str является 'how.i.met.your.mother.s03e13.hdtv.mkv' он соответствует выше регулярному выражению и выходы

how.i.met.your.mother.s0 

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

+2

Ребята, если вы голосуете, я по крайней мере даю причину. – ronnie

ответ

2

я не знаю, почему он соответствующий эту строку

.*?    "vkm.vtdh." 
\d{1,2}   "31" 
(?:e|edosipe)? "e" 
[._\- x]?   "" 
\d{1,2}   "3" 
(?:s|nosaes)?  "" 
[._\- ]?   "" 
(?=\d+)   "0" 
(.*)    "0s.rehtom.ruoy.tem.i.woh" 

Возможное решение изменить (и)

\d{1,2} 

к

\d{1,2}(?!\d) # Don't match just "3" of "30". 
       # Bonus: Can't match part of "123". 

или

(?>\d{1,2}) # Prevents it from matching just 
       # one digit if there are two. 
       # Note: Can match "12" of "123". 

Конечно, тогда (?=\d+) приведет к сбою всего. Я понятия не имею, почему это в первую очередь. Может, ты имел в виду (?!\d+)? (В обоих случаях + бесполезен.)

+0

+1 Прекрасно сделано. – RanRag

+0

Причина, по которой я использовал '(? = \ D +)', заключается в том, что я хочу, чтобы я соответствовал только той строке, в которой 's | season' находится под давлением' number'. Если я использую '(?! \ D +)', то он будет соответствовать указанному выше 'how.i ....' случаю, к которому я не хочу этого делать. – ronnie

+0

Я думал, что '{m, n}' всегда выполняет жадное совпадение, а его нежелательная версия - '{m, n}?'. Любая причина, по которой она не соответствует '30' и вместо этого соответствует только' 3'. Я новичок в регулярном выражении. – ronnie

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