English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Записки о RegExp: Объект JavaScript RegExp

Обзор

Конструктор RegExp создает объект регулярного выражения, который используется для совпадения с текстом.

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

Грамматика

Текст и конструктивные символы возможны:
/pattern/flags new RegExp(pattern [, flags])

Параметры

pattern
Текст регулярного выражения
flags
Если указан, флаг может быть любым сочетанием следующих значений:

g
Глобальное совпадение
i
Игнорировать регистр
m
Многострочный режим; позволяет начальным и终结альным символам (^ и $) работать в многострочном режиме (например, ^ и $ могут совпадать с началом и концом каждой строки в строке, разделенной символами \n или \r, а не только с началом и концом всей входной строки).
u
Unicode. Паттерн рассматривается как последовательность Unicode кодовых точек (code points).
y
Вязкость; В целевой строке, совпадение начинается только с позиции, указанной свойством lastIndex регулярного выражения (и не пытается совпадать с любыми другими индексами).
描述
有两种方法可以创建一个正则对象:字面量和构造函数。要表示字符串,字面量形式不使用引号,而传递给构造函数的参数使用引号。下面表达式创建相同的正则表达式:

/ab+c/i;
new RegExp('ab+c', 'i');
new RegExp(/ab+c/, 'i');

当表达式被赋值时,字面量形式提供正则表达式的编译(compilation)状态,当正则表达式保持为常量时使用字面量。例如当你在循环中使用字面量构造一个正则表达式时,正则表达式不会在每一次迭代中都被重新编译(recompiled)。
而正则表达式对象的构造函数,如 new RegExp('ab+c') 提供了正则表达式运行时编译(runtime compilation)。如果你知道正则表达式模式将会改变,或者你事先不知道什么模式,而是从另一个来源获取,如用户输入,这些情况都可以使用构造函数。
从ECMAScript 6开始,当第一个参数为正则表达式而第二个标志参数存在时,new RegExp(/ab+c/, 'i')不再抛出TypeError (“当从其他正则表达式进行构造时不支持标志”)的异常,取而代之,将使用这些参数创建一个新的正则表达式。

当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \)。比如,以下是等价的:

var re = new RegExp("\\w+");
var re = /\w+/;

以字面量定义正则表达式
var expression = /pattern/ flags;
pattern 部分可以是任何简单或复杂的正则表达示
flage 标明正则表达式的行为 1.g:全局模式,不会在发现第一个匹配项后停止 2.i:不区分大小写模式 3.m:多行模式
Пример:

var pattern1 = /at/g; //匹配字符串中所有at
var pattern2 = /[bc]at/i; //匹配第一个“bat”或“cat”,不区分大小写
var pattern3 = /.at/gi; //全局匹配以.at“结尾”的三个字符。不区分小写

模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:([{\^$|?*+.}])
Пример:

var pattern4 = /\[bc\]at/i; //匹配第一个“[bc]at”,不区分大小写

Использование конструктора RegExp, принимает 2 параметра, параметр 1: строка шаблона для соответствия, параметр 2: опциональные флаги поведения
Пример:

var pattern5 = new RegExp("[bc]at", "i");

Примечание: Поскольку параметр шаблона конструктора RegExp является строкой, в некоторых случаях необходимо выполнять двойную экранизацию строки. Все символы метки должны быть двойными.

Пример:
Лiteral        Equivalent string
/\[bc\]at/      "\\[bc\\]at"
/\.at/        "\\.at"
/name/\age/    "name\\/age"
/\d.\d{1,2}/    "\\d.\\d{1,2}"
/\w\\hello\\123/ "\\w\\\\hello\\\\123"

Примечание: Создание регулярного выражения с помощью литерала и инстанцирования不一样, литерал всегда будет делиться одним и тем же экземпляром RegExp (ECMAScript3). Каждый новый экземпляр RegExp, созданный с помощью конструктора, является новым экземпляром.

Свойства экземпляра RegExp

console.log(pattern5.global); //false Установлен ли флаг g
console.log(pattern5.ignoreCase); //true Установлен ли флаг i
console.log(pattern5.multiline); //false Установлен ли флаг m
console.log(pattern5.lastIndex); //0 Начальная позиция для поиска следующего совпадения
console.log(pattern5.source); //[bc]at String representation of regular expression

Наследуемые свойства

console.log(pattern5.toString()); // /[bc]at/i Лiteral representation of regular expression
console.log(pattern5.toLocaleString()); // /[bc]at/i Лiteral representation of regular expression
console.log(pattern5.valueOf()); // /[bc]at/i Лiteral representation of regular expression

Методы экземпляра RegExp
Метод один: exec(), принимает один параметр, это строка шаблона. Возвращает массив с информацией о первом совпадении, в случае отсутствия совпадений возвращает null, массив实例 содержит два свойства index (позиция совпадения в строке) и input (строка, на которую применен регулярный выражение).

var text = "huang jin liang shi ge hao ren";
var pattern6 = new RegExp("huang( jin liAng( shi ge hao ren)?)?", "i");
var matches = pattern6.exec(text);
console.log(matches); 
//[ 'huang jin liang shi ge hao ren',
// ' jin liang shi ge hao ren',
// ' shi ge hao ren',
// индекс: 0,
// ввод: 'huang jin liang shi ge hao ren' ]
var text1 = "cat, bat, sat";
var pattern7 = new RegExp(".at")
var matches1 = pattern7.exec(text1);
console.log(matches1); //cat
var pattern8 = new RegExp(".at", "gm");
var matches2 = pattern8.exec(text1);
console.log(matches2); //cat
var matches3 = pattern8.exec(text1);
console.log(matches3); //bat
var matches4 = pattern8.exec(text1);
console.log(matches4); //sat
var matches5 = pattern8.exec(text1);
console.log(matches5); //null

Метод второй: test(), принимает один параметр, это строка шаблона. Возвращает true, если шаблон соответствует параметру,否则 false

var text2 = "000-00-0000";
var pattern9 = new RegExp("\\d{3}-\\d{2}-\\d{4}");
console.log(pattern9.test(text2))
console.log(text2);
if (pattern9.test(text2)) {
console.log("Найдено совпадение");
}
console.log("Не удалось найти совпадение");
}

Свойства конструктора (некоторыми браузерами не поддерживается)
Длинные имена свойств    Короткие имена свойств    Объяснение
input $_ последнее вхождение строки, которое нужно соответствует
lastMatch $& последнее соответствие
lastParen $+ последняя захватывающая группа
leftContext $` текст, находящийся до lastMatch в input字符串е
multiline $* логический, является ли это многострочным режимом
rightContext $' текст, находящийся после lastMatch в input字符串е
        $1~$9 используются для хранения нескольких захватывающих групп

В ограничениях ECMAScript
1. Присоединение и завершение строки с помощью ана и з
2. Возвратный поиск
3. Типы объединения и пересечения
4. Атомарные группы
5. Поддержка Unicode (за исключением единичных символов)
6. Именованные группы захвата
7. С и x соответствие шаблону
8. Условное соответствие
9. Комментарии в регулярных выражениях

Н newly found method for matching multiline in js

<script>
var s = "Please yes\nсделайте мой день лучше!";
alert(s.match(/yes.*day/));
// Возвращает null
alert(s.match(/yes[^]*day/));
// Возвращает 'yes\nсделайте мой день лучше'
</script>

К сожалению, editplus не работает, часто удобнее использовать dw.

Основной учебник
Рекомендуется для просмотра