2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Регулярки, позиционная проверка, якорные метасимволы
Сообщение21.07.2019, 20:50 


21/07/19
2
Есть строка "123456789". Есть вот такая регулярка
Используется синтаксис PCRE
(?=(\d{3})+)

https://regex101.com/r/05cZ3B/2
Данная регулярка ищет позиции, с которых начинаются совпадения хотя бы одной группы из трех цифр. То есть каждая позиция в заданной строке, за исключением последних двух вызывает совпадение. Для проверки я делаю вставку запятых и получаю ",1,2,3,4,5,6,789". Я верно понимаю как оно работает?

А теперь я добавлю в конец границу слова вот так
Используется синтаксис PCRE
(?=(\d{3})+\b)

https://regex101.com/r/05cZ3B/1/

При вставке запятых получается ",123,456,789"
Вопрос: почему добавление границы слова так влияет на поиск, что теперь ищется группы по три символа подряд (теперь эти группы не пересекаются)? Почему такое выражение не находит позиции второго, третьего, пятого, шестого и т.д. символов? Впечатление, что оно перестало возвращаться к первой позиции и стало захватывать группы по три символа.
Это кусок примера из Фридла, но объяснения почему оно так работает мне не понятно. Вот цитата оттуда
Цитата:
Группа из трех цифр определяется выражением \d\d\d. Заключим ее в конструкцию (…)+, чтобы совпадение могло состоять из нескольких групп, и завершим метасимволом $, чтобы гарантировать отсутствие символов после совпадения.


-- 21.07.2019, 20:08 --

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

 Профиль  
                  
 
 Re: Регулярки, позиционная проверка, якорные метасимволы
Сообщение21.07.2019, 21:10 
Заслуженный участник


27/04/09
28128
Не думайте о возвращении, думайте о том, возможно ли поматчить, например, начиная с двойки: должно найтись больше одной группы из трёх цифр и после этого конец строки. Можно ли так сделать в 23456789? Нет. Просто переберите все варианты, их меньше пяти.

Простая реализация этого дела при этом пойдёт так: она начнёт матчить (\d{3})+$, начнёт матчить (\d{3})+, начнёт матчить \d{3}. Тут она откусит 234, закончит матчить \d{3} и начнёт матчить (\d{3})*, попробует матчить \d{3} снова и откусит 567, закончит, попробует \d{3}, не сможет, попробует альтернативно поматчить пустую строку, и тут сможет, завершит матчить (\d{3})*, завершит плюс, начнёт матчить $ и обломается. Но мы проверили ещё не всё, что могли. Она вернётся и попробует вместо 567 поматчить пустую строку. Это в конечном итоге опять ничего не даст. После этого у нас вариантов не осталось и пишем провал.

(Сложная может делать в принципе как угодно, и пока мы не пишем совсем уж неэффективные регэксы, нас не должно волновать как оно работает.)

-- Вс июл 21, 2019 23:12:42 --

(Мне было лень делать описание в виде дерева, вообще стоило бы в виде.)

 Профиль  
                  
 
 Re: Регулярки, позиционная проверка, якорные метасимволы
Сообщение21.07.2019, 21:15 
Аватара пользователя


31/10/08
1244
Первая регулятора находит следующие значения
123456789
(123)
(123)(456)
(123)(456)(789)
(234)
(234)(567)
(345)
(345)(678)
(456)
(456)(789)
(567)
(678)
(789)


Вторая оставляет те которые приходятся на границу слова.
(123)(456)(789)
(456)(789)
(789)

 Профиль  
                  
 
 Re: Регулярки, позиционная проверка, якорные метасимволы
Сообщение21.07.2019, 21:18 


21/07/19
2
arseniiv, Pavia спасибо. Вот когда меня в ткнули носом в похожее, я и увидел как оно работает. Не пойму почему я сам этого не сделал, до этого простые регулярки так и парсил у себя в голове для понимания.

 Профиль  
                  
 
 Re: Регулярки, позиционная проверка, якорные метасимволы
Сообщение21.07.2019, 21:34 
Заслуженный участник


27/04/09
28128
А, такое у всех бывает, не беспокойтесь. Тоже смотришь вроде со всех сторон и не замечаешь.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group