Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Вырезать регуляркой (https://javascript.ru/forum/server/4415-vyrezat-regulyarkojj.html)

x-yuri 23.07.2009 20:52

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

Riim 23.07.2009 21:40

Цитата:

Сообщение от x-yuri
Так что имхо неочевидно, что быстрее

Если еще немного подумать, то не жадная 100% медленней.

e1f 24.07.2009 15:03

x-yuri, +1

Из вики:
Цитата:

Разница в реализации

При необходимости обработать жадный элемент шаблона, парсер начинает поиск соответствия с конца обрабатываемой строки; при обработке нежадного элемента, проверка производится с текущего места обработки строки до первого несоответствия.
Жадные будут быстрее далеко не всегда. Например, тут:
/a[\w\d]*\d/.test('a1bcdefghjk') -- схватили первое 'a', потом залезли в конец и начали отматывать аж до 'b'. Нежадный схватил бы пустую строку, не нашел за ней цифру, взял 'b' и готово.

Kolyaj 24.07.2009 15:29

Цитата:

Сообщение от e1f
парсер начинает поиск соответствия с конца обрабатываемой строки

Что за бред? Это было бы логично только для .* с модификатором m.

Riim 24.07.2009 16:01

Цитата:

Сообщение от e1f
схватили первое 'a'

Все так.

Цитата:

Сообщение от e1f
потом залезли в конец

Верно.

Цитата:

Сообщение от e1f
начали отматывать аж до 'b'

А вот здесь никуда ничего не отматывается, здесь конец строки не соответствует куску \d и регулярка выдает false.


Цитата:

Сообщение от e1f
Нежадный схватил бы пустую строку, не нашел за ней цифру, взял 'b' и готово.

Здесь сначала берется первое "а", затем \d успешно примеряется к "1" и раз успешно, то куску [\w\d]*? ничего не достается, т. е. соответствие найдено и результат true.

А раз результаты на тестируемом тексте разные, значит сравнивать производительность таким тестом не корректно.

Цитата:

Сообщение от e1f
Из вики:

Кто-то с похмелья туда написал.

e1f 24.07.2009 17:23

Результаты разные? А запускать не пробовали?
>>> /a[\w\d]*\d/.test('a1bcdefghjk')
true
>>> /a[\w\d]*?\d/.test('a1bcdefghjk')
true

В варианте 2 и Вы, и я сказали то же самое :) А вот в варианте 1 именно отматывается
Kolyaj,
Цитата:

парсер начинает поиск соответствия с конца обрабатываемой строки
здесь неточно. имеется в виду с конца максимального совпадения на данном этапе. То есть /a.*b/.test('ab11111111111111111...') отхватит все с b до конца, и только потом начнет обратно ползти

Kolyaj 24.07.2009 17:24

Конец максимального совпадения тоже еще найти надо. Но вы правы в том, что нужно просто знать, где какой квантификатор использовать.

Riim 24.07.2009 18:00

Цитата:

Сообщение от e1f
начнет обратно ползти

И правда, назад еще ползает :blink: .
Ладно, сдаюсь :) .


Часовой пояс GMT +3, время: 14:41.