Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

/(['"])[~\1]*\1/

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

Возможна также группировка элементов в регулярном выражении без создания нумерованной ссылки на эти элементы. Вместо простой группировки элементов между

(
и
)
начните группу с символов
(?:
и закончите ее символом
)
. Рассмотрим, например, следующий шаблон:

/([Jj]ava(?:[Ssjcript)?)\sis\s(fun\w*)/

Здесь подвыражение

(?:[Ss]cript)
необходимо только для группировки, чтобы к группе мог быть применен символ повторения ?. Эти модифицированные скобки не создают ссылку, поэтому в данном регулярном выражении \2 ссылается на текст, соответствующий шаблону
(fun\w*).

В табл. 10.4 приводится перечень операторов выбора из альтернатив, группировки и ссылки в регулярных выражениях.

10.1.5. Указание позиции соответствия

Как описывалось ранее, многие элементы регулярного выражения соответствуют одному символу в строке. Например,

\s
соответствует одному пробельному символу. Другие элементы регулярных выражений соответствуют позициям между символами, а не самим символам. Например,
\b
соответствует границе слова - границе между
\w
(текстовый ASCII-символ) и
\W
(нетекстовый символ) или границе между текстовым ASCII-символом и началом или концом строки. [20]

20

За исключением класса символов (квадратных скобок), где \Ь соответствует символу «забой».

Такие элементы, как

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

Например, слово «

JavaScript
», находящееся на отдельной строке, можно найти с помощью регулярного выражения
/~JavaScript$/
. Чтобы найти отдельное слово «
Java
» (а не префикс, например в слове «
JavaScript
»), можно попробовать применить шаблон
/\sJava\s/
, который требует наличия пробела [21] до и после слова. Но такое решение порождает две проблемы. Во-первых, оно найдет слово «Java», только если оно окружено пробелами с обеих сторон, и не сможет найти его в начале или в конце строки. Во-вторых, когда этот шаблон действительно найдет соответствие, возвращаемая им строка будет содержать ведущие и замыкающие пробелы, а это не совсем то, что нам нужно. Поэтому вместо шаблона, совпадающего с пробельными символами
\s
, мы воспользуемся шаблоном (или якорем), совпадающим с границами слова
\b
. Получится следующее выражение:
/\b Java\b/
. Якорный элемент
\В
соответствует позиции, не являющейся границей слова.

21

Точнее, любого пробельного символа.
– Прим. науч. ред.

То есть шаблону

/\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 приводится перечень якорных символов регулярных выражений.

10.1.6. Флаги

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

і
указывает, что поиск по шаблону должен быть нечувствителен к регистру символов, а флаг
d
– что поиск должен быть глобальным, т. е. должны быть найдены все соответствия в строке. Флаг
m
выполняет поиск по шаблону в многострочном режиме. Если строковое выражение, в котором выполняется поиск, содержит символы перевода строк, то в этом режиме якорные символы ^ и $, помимо того, что они соответствуют началу и концу всего строкового выражения, также соответствуют началу и концу каждой текстовой строки. Например, шаблону
/java$/im
соответствует как слово «
java
», так и «
Java\nis fun
».

  • Читать дальше
  • 1
  • ...
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: