/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/
Ссылка на предыдущее подвыражение указывает не на шаблон этого подвыражения, а на найденный текст, соответствующий этому шаблону. Поэтому ссылки могут использоваться для наложения ограничения, выбирающего части строки, содержащие точно такие же символы. Например, следующее регулярное выражение соответствует нулю или более символам внутри одинарных или двойных кавычек. Однако оно не требует, чтобы открывающие и закрывающие кавычки соответствовали друг другу (т. е. чтобы обе кавычки были одинарными или двойными):
/['"][~'"]*['"]/
Соответствия кавычек мы можем потребовать посредством такой ссылки:
/(['"])[~'"]*\1/
Здесь \1
соответствует совпадению с первым подвыражением. В этом примере ссылка налагает ограничение, требующее, чтобы закрывающая кавычка соответствовала открывающей. Это регулярное выражение не допускает присутствия одинарных кавычек внутри двойных, и наоборот. Недопустимо помещать ссылки внутрь классов символов, т. е. мы не можем написать:
/(['"])[~\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] За исключением класса символов (квадратных скобок), где \Ь соответствует символу «забой».
Такие элементы, как \b
, не определяют какие-либо символы, которые должны присутствовать в найденной строке, однако они определяют допустимые позиции для проверки соответствия. Иногда эти элементы называются якорными элементами регулярных выражений, потому что они закрепляют шаблон за определенной позицией в строке. Чаще других используются такие якорные элементы, как ~
и $
, привязывающие шаблоны соответственно к началу и концу строки.
Например, слово « JavaScript
», находящееся на отдельной строке, можно найти с помощью регулярного выражения /~JavaScript$/
. Чтобы найти отдельное слово « Java
» (а не префикс, например в слове « JavaScript
»), можно попробовать применить шаблон /\sJava\s/
, который требует наличия пробела [21] Точнее, любого пробельного символа. - Прим. науч. ред.
до и после слова. Но такое решение порождает две проблемы. Во-первых, оно найдет слово «Java», только если оно окружено пробелами с обеих сторон, и не сможет найти его в начале или в конце строки. Во-вторых, когда этот шаблон действительно найдет соответствие, возвращаемая им строка будет содержать ведущие и замыкающие пробелы, а это не совсем то, что нам нужно. Поэтому вместо шаблона, совпадающего с пробельными символами \s
, мы воспользуемся шаблоном (или якорем), совпадающим с границами слова \b
. Получится следующее выражение: /\b Java\b/
. Якорный элемент \В
соответствует позиции, не являющейся границей слова.
Читать дальше
Конец ознакомительного отрывка
Купить книгу