Динамическая генерация Javascript Regexp из переменных?

Как построить два шаблона регулярных выражений в один?

Например, у меня один длинный шаблон и один меньше, мне нужно поставить меньший перед длинным.

var pattern1 = ':\(|:=\(|:-\(';
var pattern2 = ':\(|:=\(|:-\(|:\(|:=\(|:-\('
str.match('/'+pattern1+'|'+pattern2+'/gi');

Это не работает. Когда я конкатенирую строки, все черты исчезли.

Ответ 1

Вы должны использовать RegExp:

str.match(new RegExp(pattern1+'|'+pattern2, 'gi'));

Когда я конкатенирую строки, все слэши исчезли.

Если у вас есть обратная косая черта в шаблоне, чтобы избежать специального символа регулярного выражения (например, \(), вы должны использовать два обратную косую черту в строке (потому что \ является символом escape в строке): new RegExp('\\(') будет таким же, как /\(/.

Итак, ваши шаблоны должны стать:

var pattern1 = ':\\(|:=\\(|:-\\(';
var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\(';

Ответ 2

Используйте ниже:

var regEx = new RegExp(pattern1+'|'+pattern2, 'gi');

str.match(regEx);

Ответ 3

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

var regex = new RegExp(pattern1+'|'+pattern2, 'gi');
str.match(regex);

Ответ 4

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

    var pattern1 = ':\\(|:=\\(|:-\\(';
    var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\(';
    var regex = new RegExp(pattern1 + '|' + pattern2, 'gi');
    str.match(regex);

Над кодом отлично работает для меня...