Как описывалось ранее, многие элементы регулярного выражения соответству_ ют одному символу в строке. Например, \s соответствует одному символу_разде_ лителю. Другие элементы регулярных выражений соответствуют позициям
в тексте, а не самим символам. Например, \b соответствует границе слова – гра_ нице между \w (текстовый ASCII_символ) и \W (нетекстовый символ), или грани_ це между текстовым ASCII_символом и началом или концом строки.1 Такие эле_ менты, как \b, не задают каких_либо символов, которые должны присутствовать
в найденной строке, однако они определяют допустимые позиции для проверки соответствия. Иногда эти элементы называются якорными элементами регуляр' ных выражений, т. к. они закрепляют шаблон за определенной позицией в стро_ке. Чаще других используются такие якорные элементы, как ^ и $, привязываю_ щие шаблоны соответственно к началу и концу строки.
Например, слово «JavaScript», находящееся на отдельной строке, можно найти с помощью регулярного выражения /^JavaScript$/. Отдельное слово «Java» (а не префикс, например в «JavaScript») можно поискать по шаблону /\sJava\s/, кото_ рый требует наличия пробела2 до и после слова. Но такое решение порождает две проблемы. Во_первых, оно найдет слово «Java», только если оно окружено про_ белами с обеих сторон, и не сможет найти его в начале или в конце строки. Во_
1 За исключением класса символов (квадратных скобок), где \b соответствует символу «забой».
2 Точнее, любого разделителя. – Примеч. науч. ред.
222 Глава 11. Шаблоны и регулярные выражения
вторых, когда этот шаблон действительно найдет соответствие, возвращаемая им строка будет содержать ведущие и замыкающие пробелы, а это не совсем то, что нам нужно. Поэтому вместо шаблона для реальных символов_разделителей \s мы воспользуемся шаблоном (или якорем) для границ слова \b. Получится следующее выражение: /\bJava\b/. Элемент \B представляет собою якорь для по_ зиции, не являющейся границей слова. То есть шаблону /\B[Ss]cript/ будут со_ ответствовать слова «JavaScript» и «postscript» и не соответствовать слова «script» или «Scripting».
В JavaScript 1.5 (но не в JavaScript 1.2) в качестве якорных условий могут также выступать произвольные регулярные выражения. Если поместить выражение между символами (?= и ), оно станет условием на последующие символы, тре_ бующим, чтобы эти символы соответствовали указанному шаблону, но не вклю_ чались в строку соответствия. Например, найти имя языка программирования JavaScript, но только там, где за ним следует двоеточие, можно посредством вы_ ражения /[Jj]ava([Ss]cript)?(?=\:)/. Этот шаблон найдет слово «JavaScript» в предложении «JavaScript: The Definitive Guide», но проигнорирует слово «Ja_ va» в предложении «Java in a Nutshell», т. к. после него нет двоеточия.
Если же ввести условие символами (?!, то это будет отрицательное условие на по_ следующие символы, требующее, чтобы следующие символы не соответствовали указанному шаблону. Так, /Java(?!Script)([A_Z]\w*)/ соответствует слову «Java», за которым следует прописная буква и произвольное количество дополнитель_ ных текстовых ASCII_символов, если только за «Java» не следует «Script». Этому шаблону соответствует «JavaBeans», но не соответствует «Javanese», соответст_ вует «JavaScrip», но не соответствует «JavaScript» или «JavaScripter».
В табл. 11.5 приводится перечень якорных символов регулярных выражений.