renovations
This commit is contained in:
parent
8f221d05c4
commit
a6cf38dd02
52 changed files with 405 additions and 325 deletions
|
@ -6,11 +6,11 @@
|
|||
|
||||
[cut]
|
||||
|
||||
Класс символов -- это специальное обозначение, под которое подходит любой символ данного класса.
|
||||
Класс символов -- это специальное обозначение, под которое подходит любой символ из определённого набора.
|
||||
|
||||
Например, класс "любая цифра" обозначается `\d`. Это обозначение вставляется в паттерн наравне с остальными символами, и при поиске под него подходит любая цифра.
|
||||
Например, есть класс "любая цифра". Он обозначается `\d`. Это обозначение вставляется в шаблон, и при поиске под него подходит любая цифра.
|
||||
|
||||
Регулярное выражение <code class="pattern">/\d/</code> ищет ровно одну цифру (первую):
|
||||
То есть, регулярное выражение <code class="pattern">/\d/</code> ищет ровно одну цифру:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
@ -18,10 +18,11 @@ var str = "+7(903)-123-45-67";
|
|||
|
||||
var reg = /\d/;
|
||||
|
||||
// не глобальный регэксп, поэтому ищет только первую цифру
|
||||
alert( str.match(reg) ); // 7
|
||||
```
|
||||
|
||||
...Ну а для поиска всех цифр достаточно добавить к нему флаг `g`:
|
||||
...Ну а для поиска всех цифр достаточно добавить к регэкспу флаг `g`:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
@ -29,28 +30,30 @@ var str = "+7(903)-123-45-67";
|
|||
|
||||
var reg = /\d/g;
|
||||
|
||||
alert( str.match(reg) ); // массив цифр: 7,9,0,3,1,2,3,4,5,6,7
|
||||
alert( str.match(reg) ); // массив всех совпадений: 7,9,0,3,1,2,3,4,5,6,7
|
||||
```
|
||||
|
||||
## Важнейшие классы
|
||||
## Важнейшие классы: \d \s \w
|
||||
|
||||
Это был класс для цифр.
|
||||
|
||||
Конечно же, есть и другие. Самые полезные классы:
|
||||
Конечно же, есть и другие.
|
||||
|
||||
Наиболее часто используются:
|
||||
<dl>
|
||||
<dt>`\d` (от английского "digit" - "цифра")</dt>
|
||||
<dd>Цифра, символ от `0` до `9`.</dd>
|
||||
<dt>`\s` (от английского "space" - "пробел")</dt>
|
||||
<dd>Пробельный символ, включая табы, переводы строки и т.п.</dd>
|
||||
<dt>`\w` (от английского "word" -- "слово") </dt>
|
||||
<dd>Символ латинского алфавита или цифра или подчёркивание `'_'`. Не-английские буквы не являются `\w`.</dd>
|
||||
<dd>Символ "слова", а точнее -- буква латинского алфавита или цифра или подчёркивание `'_'`. Не-английские буквы не являются `\w`, то есть русская буква не подходит.</dd>
|
||||
</dl>
|
||||
|
||||
Регулярное выражение как правило содержит одновременно и обычные символы и классы.
|
||||
Например, <code class="pattern">\d\s\w</code> обозначает цифру, за которой идёт пробельный символ, а затем символ слова.
|
||||
|
||||
Например, <code class="pattern">CSS\d</code> найдёт строку <code class="match">CSS</code>, с любой цифрой после неё.
|
||||
Регулярное выражение может содержать одновременно и обычные символы и классы.
|
||||
|
||||
Пример ниже найдёт строку `CSS` с любой цифровой версией:
|
||||
Например, <code class="pattern">CSS\d</code> найдёт строку <code class="match">CSS</code>, с любой цифрой после неё:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
@ -60,7 +63,7 @@ var reg = /CSS\d/
|
|||
alert( str.match(reg) ); // CSS4
|
||||
```
|
||||
|
||||
Можно указать и несколько классов в одном регэкспе:
|
||||
И много классов подряд:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
@ -69,12 +72,47 @@ alert( "Я люблю HTML5!".match(/\s\w\w\w\w\d/) ); // 'HTML5'
|
|||
|
||||
Совпадение (каждому классу в регэкспе соответствует один символ результата):
|
||||
|
||||
<img src="love_html5.png">
|
||||
<img src="love-html5-classes.svg">
|
||||
|
||||
## Граница слова \b
|
||||
|
||||
Граница слова <code class="pattern">\b</code> -- это особый класс.
|
||||
|
||||
Он интересен тем, что обозначает не символ, а границу между символами.
|
||||
|
||||
Например, <code class="pattern">\bJava\b</code> найдёт слово <code class="match">Java</code> в строке <code class="subject">Hello, Java!</code>, но не в строке <code class="subject">Hello, Javascript!</code>.
|
||||
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
||||
alert( "Hello, Java!".match(/\bJava\b/) ); // Java
|
||||
alert( "Hello, Javascript!".match(/\bJava\b/) ); // null
|
||||
```
|
||||
|
||||
Граница имеет "нулевую ширину" в том смысле, что обычно символам регулярного выражения соответствуют символы строки, но не в этом случае.
|
||||
|
||||
Граница -- это проверка.
|
||||
|
||||
При поиске движок регулярных выражений идёт по шаблону и одновременно по строке, пытаясь построить соответствие. Когда он видит <code class="pattern">\b</code>, то проверяет, что текущая позиция в строке подходит под одно из условий:
|
||||
<ul>
|
||||
<li>Начало текста, если первый символ `\w`.</li>
|
||||
<li>Конец текста, если последний символ `\w`.</li>
|
||||
<li>Внутри текста, если с одной стороны `\w`, а с другой -- не `\w`.</li>
|
||||
</ul>
|
||||
|
||||
Например, в строке <code class="subject">Hello, Java!</code> под `\b` подходят следующие позиции:
|
||||
|
||||
<img src="hello-java-boundaries.svg">
|
||||
|
||||
Как правило, `\b` используется, чтобы искать отдельно стоящее слово. Не на русском конечно, хотя подобную проверку, как мы увидим далее, можно легко сделать для любого языка. А вот на английском, как в примере выше или для чисел, которые являются частным случаем `\w` -- легко.
|
||||
|
||||
Например, регэксп <code class="pattern">\b\d\d\b</code> ищет отдельно двузначные числа. Иными словами, он требует, чтобы до и после <code class="pattern">\d\d</code> был символ, отличный от `\w` (или начало/конец текста).
|
||||
|
||||
|
||||
## Обратные классы
|
||||
|
||||
Для каждого символьного класса существует "обратный ему", представленный такой же, но заглавной буквой.
|
||||
Для каждого класса существует "обратный ему", представленный такой же, но заглавной буквой.
|
||||
|
||||
"Обратный" -- означает, что ему соответствуют все остальные символы, например:
|
||||
|
||||
|
@ -85,11 +123,15 @@ alert( "Я люблю HTML5!".match(/\s\w\w\w\w\d/) ); // 'HTML5'
|
|||
<dd>Не-пробел, то есть любой символ кроме `\s`, например буква.</dd>
|
||||
<dt>`\W`</dt>
|
||||
<dd>Любой символ, кроме `\w`, то есть не латинница, не подчёркивание, не цифра. В частности, русские буквы принадлежат этому классу.</dd>
|
||||
<dt>`\B`</dt>
|
||||
<dd>Проверка, обратная `\b`.</dd>
|
||||
</dl>
|
||||
|
||||
В начале этой главы мы видели, как получить из телефона <code class="subject">+7(903)-123-45-67</code> все цифры.
|
||||
|
||||
Первый способ -- найти все цифры через `match(/\d/g)`, но есть и альтернативный -- найти все НЕцифры и удалить их из строки:
|
||||
Первый способ -- найти все цифры через `match(/\d/g)`.
|
||||
|
||||
Обратные классы помогут реализовать альтернативный -- найти все НЕцифры и удалить их из строки:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
@ -98,19 +140,15 @@ var str = "+7(903)-123-45-67";
|
|||
alert( str.replace(/\D/g, "") ); // 79031234567
|
||||
```
|
||||
|
||||
## Спецсимволы
|
||||
## Пробелы -- обычные символы
|
||||
|
||||
Регулярное выражение может также содержать стандартные спецсимволы строк, такие как перевод строки `\n`, табуляцию `\t` и другие.
|
||||
|
||||
Отличить их от классов очень просто -- для классов зарезервированы другие буквы. Так что никакого конфликта здесь нет.
|
||||
|
||||
## Пробелы
|
||||
Заметим, что в регулярных выражениях пробел - такой же символ, как и другие.
|
||||
|
||||
Обычно мы не обращаем внимание на пробелы. Для нашего взгляда строки <code class="subject">1-5</code> и <code class="subject">1 - 5</code> почти идентичны.
|
||||
|
||||
Но в регулярных выражениях пробел - такой же символ, как и другие.
|
||||
Однако, если регэксп не учитывает пробелов, то он не сработает.
|
||||
|
||||
Поиск ниже не сработает, так как не учитывает пробелы вокруг дефиса:
|
||||
Попытаемся найти цифры, разделённые дефисом:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
@ -124,14 +162,16 @@ alert( "1 - 5".match(/\d-\d/) ); // null, нет совпадений!
|
|||
alert( "1 - 5".match(/\d - \d/) ); // работает, пробелы вокруг дефиса
|
||||
```
|
||||
|
||||
В регулярные выражения также не надо вставлять лишние пробелы. Все символы имеют значение:
|
||||
Конечно же, пробелы в регэкспе нужны лишь тогда, когда мы их ищем. Лишние пробелы (как и любые лишние символы) могут навредить:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
alert( "1-5".match(/\d - \d/) ); // null, так как в строке 1-5 нет пробелов
|
||||
```
|
||||
|
||||
## Класс точка
|
||||
Короче говоря, в регулярном выражении все символы имеют значение. Даже (и тем более) -- пробелы.
|
||||
|
||||
## Точка -- любой символ
|
||||
|
||||
Особым классом символов является точка `"."`.
|
||||
|
||||
|
@ -208,6 +248,7 @@ alert( "/".match(/\//) ); // '/'
|
|||
alert( "1\2".match(/\\/) ); // '\'
|
||||
```
|
||||
|
||||
|
||||
## Итого
|
||||
|
||||
Мы рассмотрели классы для поиска типов символов:
|
||||
|
@ -221,9 +262,10 @@ alert( "1\2".match(/\\/) ); // '\'
|
|||
<li>`'.'` -- точка обозначает любой символ, кроме перевода строки.</li>
|
||||
</ul>
|
||||
|
||||
Кроме того, в регэкспах допустимы и обычные спец-символы строк, например `\n`.
|
||||
Если хочется поискать именно сочетание `"\d"` или символ "точка", то его экранируют обратным слэшем, вот так: <code class="pattern">\.</code>
|
||||
|
||||
Заметим, что регулярное выражение может также содержать перевод строки `\n`, табуляцию `\t` и прочие спецсимволы для строк. Конфликта с классами не происходит, так как для них зарезервированы другие буквы.
|
||||
|
||||
Если хочется поискать именно точку или какой-то другой "особый" символ, то его экранируют: <code class="pattern">\.</code>
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue