en.javascript.info/10-regular-expressions-javascript/3-regexp-character-classes/article.md
2015-02-27 13:21:58 +03:00

152 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Символьные классы
Рассмотрим задачу -- есть телефонный номер `"+7(903)-123-45-67"`, и нам нужно найти в этой строке цифры, а остальные символы нас не интересуют.
**Для поиска символов определённого вида, в регулярных выражениях предусмотрены "классы символов".**
[cut]
Класс символов -- это, в первую очередь, специальное обозначение.
Например, в данном случае нам нужен класс "произвольная цифра", он обозначается `\d`.
Это обозначение вставляется в паттерн наравне с остальными символами. При поиске под него подходит любая цифра.
Пример ниже ищет все цифры в строке:
```js
//+ run
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
```
Есть и другие классы. Самые полезные:
<dl>
<dt>`\d` (от английского "digit" - "цифра")</dt>
<dd>Цифра, символ от `0` до `9`.</dd>
<dt>`\s` (от английского "space" - "пробел")</dt>
<dd>Пробельный символ, включая табы, переводы строки и т.п.</dd>
<dt>`\w` (от английского "word" -- "слово") </dt>
<dd>Символ латинского алфавита или цифра или подчёркивание `'_'`</dd>
</dl>
**Регулярное выражение обычно содержит одновременно и обычные символы и классы**:
Например, найдём строку `CSS` с любой цифровой версией:
```js
//+ run
var str = "Стандарт CSS4 - наше будущее";
var reg = /CSS\d/
alert( str.match(reg) );
```
Несколько классов в одном регэкспе:
```js
//+ run
showMatch( "Я люблю HTML5!", /\s\w\w\w\w\d/ ); // 'HTML5'
```
Совпадение (каждому классу в регэкспе соответствует один символ результата):
<img src="love_html5.png">
**Также существуют обратные символьные классы:**
<dl>
<dt>`\D`</dt>
<dd>Не-цифра, любой символ кроме `\d`</dd>
<dt>`\S`</dt>
<dd>Не-пробел, любой символ кроме `\s`.</dd>
<dt>`\W`</dt>
<dd>Символ, не принадлежащий латиннице, а также не буква и не подчёркивание, алфавиту, т.е. любой кроме `\w`</dd>
</dl>
Например, мы хотим получить из телефона <code class="subject">+7(903)-123-45-67</code> только цифры.
Есть два способа сделать это.
<ol>
<li>Первый -- найти все цифры и объединить их:
Например:
```js
//+ run
var str = "+7(903)-123-45-67";
var digits = str.match( /\d/g ).join("");
alert(digits); // 79031234567
```
</li>
<li>Второй -- найти все НЕцифры и удалить их из строки:
```js
//+ run
var str = "+7(903)-123-45-67";
alert( str.replace(/\D/g, "") ); // 79031234567
```
Второй способ короче, не правда ли?
</li>
</ol>
**Регулярное выражение может также содержать стандартные спецсимволы строк, такие как `\n, \t` и другие.**
Они являются обычными символами. Отличить их от классов очень просто -- для классов зарезервированы другие буквы.
[warn header="Пробелы важны!"]
Обычно мы не обращаем внимание на пробелы. Для нашего взгляда строки <code class="subject">1-5</code> и <code class="subject">1 - 5</code> почти идентичны.
Но в регулярных выражениях **пробел - такой же символ, как и другие**.
Поиск ниже не сработает, т.к. не учитывает пробелы вокруг дефиса:
```js
//+ run
alert( "1 - 5".match (/\d-\d/) ); // null, нет совпадений!
```
Поправим это, добавив в паттерн пробелы:
```js
//+ run
alert( "1 - 5".match (/\d - \d/) ); // работает, пробелы вокруг дефиса
```
В регулярные выражения также не надо вставлять лишние пробелы. Все они имеют значение:
```js
//+ run
alert( "1-5".match( /\d - \d/ ) ); // null, так как в строке 1-5 нет пробелов
```
[/warn]
Особым классом символов является точка `"."`.
**В регулярном выражении, точка <code class="pattern">"."</code> обозначает *любой символ*, кроме перевода строки**:
```js
//+ run
var re = /CS.4/;
alert( "Стандарт CSS4".match(re) ); // найдено "CSS4"
alert( "Сталь CS-4".match(re) ); // найдено "CS-4"
alert( "CS 4".match(re) ); // найдено "CS 4", пробел тоже символ
```
Обратим внимание -- точка означает именно "произвольный символ".
То есть какой-то символ на этом месте в строке должен быть:
```js
//+ run
alert( "CS4".match (/CS.4/) ); // нет совпадений, так как для точки нет символа
```