2015-02-21 4 views
1

My student guideline содержит этот пример.Regex необходимо пояснение

Мне нужно найти все -tation в перевозки, но, например, не депортация.
Я использую регулярное выражение с утверждением 'назад

/(?<=transpor)tation/ 

Также есть эквивалент

/tation(?<=transportation)/ 

Это говорит первый регулярное выражение

больше эффективности, так как он не отступает - двигатель Безразлично» t проверка состояние второй раз.

Ok. Это хорошо.
И неясна фраза для меня

Обычно это будет либо соответствовать тексту в первый раз или использовать предпросмотр, чтобы проверить, что соответствует второму шаблону вместо возвратов через него во второй раз с просмотром назад ,

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

Спасибо.

+1

Эта фраза действительно неясна. Я думаю, что головоломку лучше всего решить автор этого руководства. Но мне кажется, что это абсурд. Наверное, где-то есть ошибка. –

+0

Это означает, что первое из двух выражений более эффективно. –

+0

Да. Я также думаю, что FIRST подсказка означает, что выражение № 1 более эффективно. О подсказке SECOND: я полагаю, он говорит о lookahead, захватывая группу и язык программирования (извлечение из строки с использованием обратных ссылок). Но это странно.) – user64667

ответ

0

Я бы не стал задумываться над этим; утверждения, как представляется, основаны на предположениях о внутренней логике двигателей регулярного выражения, которые не являются универсальными.
Чтобы пролить свет на это, я просмотрел информацию об отладке компилятора регулярных выражений Perl.

Code:

use re 'debug'; 
/(?<=transpor)tation/; 
/tation(?<=transportation)/; 

Выход:

Compiling REx `(?<=transpor)tation' 
size 11 Got 92 bytes for offset annotations. 
first at 1 
    1: IFMATCH[-8](8) 
    3: EXACT <transpor>(6) 
    6: SUCCEED(0) 
    7: TAIL(8) 
    8: EXACT <tation>(11) 
    11: END(0) 
anchored `tation' at 0 (checking anchored) minlen 6 
Offsets: [11] 
    12[8] 0[0] 5[8] 0[0] 0[0] 12[0] 12[0] 14[6] 0[0] 0[0] 20[0] 
Compiling REx `tation(?<=transportation)' 
size 13 Got 108 bytes for offset annotations. 
first at 1 
    1: EXACT <tation>(4) 
    4: IFMATCH[-14](13) 
    6: EXACT <transportation>(11) 
    11: SUCCEED(0) 
    12: TAIL(13) 
    13: END(0) 
anchored `tation' at 0 (checking anchored) minlen 6 
Offsets: [13] 
    1[6] 0[0] 0[0] 24[14] 0[0] 11[14] 0[0] 0[0] 0[0] 0[0] 24[0] 24[0] 26[0] 
Freeing REx: `"(?<=transpor)tation"' 
Freeing REx: `"tation(?<=transportation)"' 

Здесь, скомпилированные выражения, кажется, не будет существенно отличаться.

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