Книга: JavaScript. Подробное руководство, 6-е издание
10.1.5. Указание позиции соответствия
10.1.5. Указание позиции соответствия
Как описывалось ранее, многие элементы регулярного выражения соответствуют одному символу в строке. Например, s соответствует одному пробельному символу. Другие элементы регулярных выражений соответствуют позициям между символами, а не самим символам. Например, b соответствует границе слова - границе между w
(текстовый ASCII-символ) и W
(нетекстовый символ) или границе между текстовым ASCII-символом и началом или концом строки.[20]
Такие элементы, как b, не определяют какие-либо символы, которые должны присутствовать в найденной строке, однако они определяют допустимые позиции для проверки соответствия. Иногда эти элементы называются якорными элементами регулярных выражений, потому что они закрепляют шаблон за определенной позицией в строке. Чаще других используются такие якорные элементы, как ~
и $
, привязывающие шаблоны соответственно к началу и концу строки.
Например, слово «JavaScript
», находящееся на отдельной строке, можно найти с помощью регулярного выражения /~JavaScript$/
. Чтобы найти отдельное слово «Java
» (а не префикс, например в слове «JavaScript
»), можно попробовать применить шаблон /sJavas/
, который требует наличия пробела [21] до и после слова. Но такое решение порождает две проблемы. Во-первых, оно найдет слово «Java», только если оно окружено пробелами с обеих сторон, и не сможет найти его в начале или в конце строки. Во-вторых, когда этот шаблон действительно найдет соответствие, возвращаемая им строка будет содержать ведущие и замыкающие пробелы, а это не совсем то, что нам нужно. Поэтому вместо шаблона, совпадающего с пробельными символами s, мы воспользуемся шаблоном (или якорем), совпадающим с границами слова b. Получится следующее выражение: /b Javab/
. Якорный элемент В
соответствует позиции, не являющейся границей слова.
То есть шаблону /B[Ss]cript/
будут соответствовать слова «JavaScript
» и «post-script
» и не будут соответствовать слова «script
» или «Scripting
».
В качестве якорных условий могут также выступать произвольные регулярные выражения. Если поместить выражение между символами (?=
и ), оно превратится в опережающую проверку на совпадение с последующими символами, требующую, чтобы эти символы соответствовали указанному шаблону, но не включались в строку соответствия. Например, чтобы найти совпадение с названием распространенного языка программирования, за которым следует двоеточие, можно воспользоваться выражением /[Jj]ava([Ss]cript)?(?=:)/
. Этому шаблону соответствует слово «JavaScript» в строке «JavaScript: The Definitive Guide», но ему не будет соответствовать слово «Java» в строке «Java in a Nutshell», потому что за ним не следует двоеточие.
Если же ввести условие (?!
, то это будет негативная опережающая проверка на последующие символы, требующая, чтобы следующие символы не соответствовали указанному шаблону. Например, шаблону /Java(?!Script)([A-Z]w*)/
соответствует подстрока «Java», за которой следует заглавная буква и любое количество текстовых ASCII-символов при условии, что за подстрокой «Java
» не следует подстрока «Script
». Он совпадет со строкой «JavaBeans
», но не совпадет со строкой «Javanese», совпадет со строкой «JavaScrip», но не совпадет со строками «JavaScript» или «JavaScripter».
В табл. 10.5 приводится перечень якорных символов регулярных выражений.
- 1.3. Мыслите с позиции пользователей
- Указание изменений в документе
- 5.4.3. Только Linux: указание файлового времени повышенной точности
- Указание сервера на клиенте BSD LPD
- Указание LPRng-сервера на стороне клиента
- У сайта отличные позиции, выросла посещаемость, но нет звонков, заказов. Почему?
- Типы с явным указанием размера
- Указание позиции файла с помощью структуры OVERLAPPED
- Указание исполняемого модуля и командной строки
- Относительность конкурентной позиции
- Миф 3. Не надо мне ваших рекомендаций, вы дайте мне высокие позиции
- 6.6.1. Спецификация номенклатурной позиции