Найти тему
CODEARMY

Якоря в регулярных выражениях

Якоря указывают на начало или конец чего-либо.

Например есть текст: "a1b2c3"

Давайте найдём все [0-9]

А теперь, поставим в начале регулярного выражения символ циркумфлекс.

^ Таким образом мы говорим что хотим найти цифры только в начале строки, т.е. начиная с нулевого символа и до тех пор пока цифры не закончатся. Наша строка начинается с букв, поэтому совпадений не найдено.

Обратите внимание что циркумлекс в зависимости от расположения ведёт себя по-разному. Просто в регулярном выражении - это начало строки. А внутри диапазона [^] он уже означает “всё кроме” т.е. к началу строки больше не имеет отношения.

Якорь $ или конец строки. Вот отличный пример его использования https://regex101.com/r/wyliWB/2 мне нужно выхватить с помощью регулярки только последний блок, т.е. адрес страницы, но уровень глубины может быть разный и заранее мне не известен.

Якорь граница слова \b работает для тех случаев, когда пробел нам не подойдёт

Например, нам нужно найти все буквы О, которые стоят на границе слова. Для этого, казалось бы подойдёт и пробел - почти всё так же, но данные представлены не в таком удобном формате.

Нам нужна не буква, а слово orange. Что такое слово? До него стоят другие слова и предлоги и после тоже.

Сделаем \s orange \s

Да последнее слово мы не нашли, потому что оно стоит в конце предложения и после него нет пробела. В конце предложения стоит точка. Т.е. нам нужен пробел или точка. Или вопросительный знак или восклицательный...

А если автор не особо грамотный и забыл точку и в конце текста вообще ничего не стоит? Якорь границы слова решит эти проблемы.

Якорь НЕ граница слова \B наоборот поможет когда нужно найти не первую букву в слове. Например я хочу найти все буквы Р которые стоят не в начале слова. Делаем так: \Bp готово! А ещё можно быстро найти только последнюю букву e в словах например так \Be\b

Якорь “начало текста” позволяет при использовании модификатора m увидеть истинное начало текста например тут https://regex101.com/r/quWSMT/1/ а если убрать \A и поставить ^ то он увидит начало каждой строки, а с \A только одно - истинное начало строки. Т.е. разница между ними есть только при многострочном тексте. Если мы уберём модификатор m то между этими двумя якорями не будет никакой разницы.

Точно так же \Z видит истинный конец текста а $ видит конец каждой строки в тексте.

Подробнее в этом видео