JavaScript. Подробное руководство, 6-е издание, стр. 142

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

<b>/\B[Ss]cript/</b>
будут соответствовать слова «
<b>JavaScript</b>
» и «
<b>post-script</b>
» и не будут соответствовать слова «
<b>script</b>
» или «
<b>Scripting</b>
».

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

<b>(?=</b>
и
<b>)</b>
, оно превратится в опережающую проверку на совпадение с последующими символами, требующую, чтобы эти символы соответствовали указанному шаблону, но не включались в строку соответствия. Например, чтобы найти совпадение с названием распространенного языка программирования, за которым следует двоеточие, можно воспользоваться выражением
<b>/[Jj]ava([Ss]cript)?(?=\:)/</b>
. Этому шаблону соответствует слово «JavaScript» в строке «JavaScript: The Definitive Guide», но ему не будет соответствовать слово «Java» в строке «Java in a Nutshell», потому что за ним не следует двоеточие.

Если же ввести условие

<b>(?!</b>
, то это будет негативная опережающая проверка на последующие символы, требующая, чтобы следующие символы не соответствовали указанному шаблону. Например, шаблону
<b>/Java(?!Script)([A-Z]\w*)/</b>
соответствует подстрока «Java», за которой следует заглавная буква и любое количество текстовых ASCII-символов при условии, что за подстрокой «
<b>Java</b>
» не следует подстрока «
<b>Script</b>
». Он совпадет со строкой «
<b>JavaBeans</b>
», но не совпадет со строкой «Javanese», совпадет со строкой «JavaScrip», но не совпадет со строками «JavaScript» или «JavaScripter».

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

JavaScript. Подробное руководство, 6-е издание - i_017.jpg

10.1.6. Флаги

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

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

Эти флаги могут объединяться в любые комбинации. Например, чтобы выполнить поиск первого вхождения слова «java» (или «Java», «JAVA» и т. д.) без учета регистра символов, можно воспользоваться нечувствительным к регистру регулярным выражением /\Ьj ava\b/i. А чтобы найти все вхождения этого слова в строке, можно добавить флаг g: /\bjava\b/gi.

В табл. 10.6 приводится перечень флагов регулярных выражений. Заметим, что флаг

<b>g</b>
более подробно рассматривается далее в этой главе вместе с методами классов
<b>String</b>
и
<b>RegExp</b>
, используемых для фактической реализации поиска.

JavaScript. Подробное руководство, 6-е издание - i_018.jpg

10.2. Методы класса String для поиска по шаблону

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

<b>String</b>
, в которых регулярные выражения применяются для поиска по шаблону, а также для поиска с заменой. А затем продолжим разговор о поиске по шаблону с регулярными выражениями, рассмотрев объект
<b>RegExp</b>
, его методы и свойства. Обратите внимание, что последующее обсуждение - лишь обзор различных методов и свойств, относящихся к регулярным выражениям. Как обычно, полное описание можно найти в третьей части книги.

Строки поддерживают четыре метода, использующие регулярные выражения. Простейший из них - метод

<b>search().</b>
Он принимает в качестве аргумента регулярное выражение и возвращает либо позицию первого символа найденной подстроки, либо
<b>-1</b>
, если соответствие не найдено. Например, следующий вызов вернет 4:

<b>&quot;JavaScript&quot;.search(/scгіpt/i);</b>

Если аргумент метода

<b>search()</b>
не является регулярным выражением, он сначала преобразуется путем передачи конструктору
<b>RegExp</b>
. Метод
<b>search()</b>
не поддерживает глобальный поиск и игнорирует флаг
<b>g</b>
в своем аргументе.

Метод

<b>replace()</b>
выполняет операцию поиска с заменой. Он принимает в качестве первого аргумента регулярное выражение, а в качестве второго - строку замены.

Метод отыскивает в строке, для которой он вызван, соответствие указанному шаблону. Если регулярное выражение содержит флаг

<b>g</b>
, метод
<b>герlасе()</b>
заменяет все найденные совпадения строкой замены. В противном случае он заменяет только первое найденное совпадение. Если первый аргумент метода
<b>герlасе()</b>
является строкой, а не регулярным выражением, то метод выполняет буквальный поиск строки, а не преобразует его в регулярное выражение с помощью конструктора
<b>RegExp(),</b>
как это делает метод
<b>search().</b>
В качестве примера мы можем воспользоваться методом
<b>replace()</b>
для единообразной расстановки прописных букв в слове «JavaScript» для всей строки текста:

<b>// Независимо от регистра символов заменяем словом в нужном регистре </b>

<b>text.replace(/JavaScript/gi, &quot;JavaScript&quot;);</b>