en.javascript.info/10-regular-expressions-javascript/3-regexp-character-classes/article.md
2015-03-05 19:14:51 +03:00

5.8 KiB
Raw Blame History

Символьные классы [todo]

Рассмотрим задачу -- есть телефонный номер "+7(903)-123-45-67", и нам нужно найти в этой строке цифры, а остальные символы нас не интересуют.

Для поиска символов определённого вида, в регулярных выражениях предусмотрены "классы символов". [cut] Класс символов -- это, в первую очередь, специальное обозначение.

Например, в данном случае нам нужен класс "произвольная цифра", он обозначается \d.

Это обозначение вставляется в паттерн наравне с остальными символами. При поиске под него подходит любая цифра.

Пример ниже ищет все цифры в строке:

//+ 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

Есть и другие классы. Самые полезные:

`\d` (от английского "digit" - "цифра")
Цифра, символ от `0` до `9`.
`\s` (от английского "space" - "пробел")
Пробельный символ, включая табы, переводы строки и т.п.
`\w` (от английского "word" -- "слово")
Символ латинского алфавита или цифра или подчёркивание `'_'`

Регулярное выражение обычно содержит одновременно и обычные символы и классы:

Например, найдём строку CSS с любой цифровой версией:

//+ run
var str = "Стандарт CSS4 - наше будущее";
var reg = /CSS\d/

alert( str.match(reg) );

Несколько классов в одном регэкспе:

//+ run
showMatch( "Я люблю HTML5!", /\s\w\w\w\w\d/ ); // 'HTML5'

Совпадение (каждому классу в регэкспе соответствует один символ результата):

Также существуют обратные символьные классы:

`\D`
Не-цифра, любой символ кроме `\d`
`\S`
Не-пробел, любой символ кроме `\s`.
`\W`
Символ, не принадлежащий латиннице, а также не буква и не подчёркивание, алфавиту, т.е. любой кроме `\w`

Например, мы хотим получить из телефона +7(903)-123-45-67 только цифры.

Есть два способа сделать это.

  1. Первый -- найти все цифры и объединить их: Например:
    //+ run
    var str = "+7(903)-123-45-67";
    
    var digits = str.match( /\d/g ).join("");
    alert(digits); // 79031234567
    
  2. Второй -- найти все НЕцифры и удалить их из строки:
    //+ run
    var str = "+7(903)-123-45-67";
    
    alert( str.replace(/\D/g, "") ); // 79031234567
    

    Второй способ короче, не правда ли?

Регулярное выражение может также содержать стандартные спецсимволы строк, такие как \n, \t и другие.

Они являются обычными символами. Отличить их от классов очень просто -- для классов зарезервированы другие буквы.

[warn header="Пробелы важны!"] Обычно мы не обращаем внимание на пробелы. Для нашего взгляда строки 1-5 и 1 - 5 почти идентичны.

Но в регулярных выражениях пробел - такой же символ, как и другие.

Поиск ниже не сработает, т.к. не учитывает пробелы вокруг дефиса:

//+ run
alert(  "1 - 5".match (/\d-\d/) );  // null, нет совпадений!

Поправим это, добавив в паттерн пробелы:

//+ run
alert(  "1 - 5".match (/\d - \d/) );  // работает, пробелы вокруг дефиса

В регулярные выражения также не надо вставлять лишние пробелы. Все они имеют значение:

//+ run
alert( "1-5".match( /\d - \d/ ) ); // null, так как в строке 1-5 нет пробелов

[/warn]

Особым классом символов является точка ".".

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

//+ run
var re = /CS.4/;

alert( "Стандарт CSS4".match(re) ); // найдено "CSS4"
alert( "Сталь CS-4".match(re) ); // найдено "CS-4" 
alert( "CS 4".match(re) ); // найдено "CS 4", пробел тоже символ

Обратим внимание -- точка означает именно "произвольный символ".

То есть какой-то символ на этом месте в строке должен быть:

//+ run
 
alert( "CS4".match (/CS.4/) ); // нет совпадений, так как для точки нет символа