2015-06-25 8 views
7

Я попытался переписать метод (часть tutorial на w3schools).Javascript: String.match() - передать строковую переменную в регулярном выражении

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

Учебник Пример кода:

function myFunction() { 
    var str = "The rain in SPAIN stays mainly in the plain"; 
    var res = str.match(/ain/gi); 
    console.log(res) 
} 

Я пробовал:

function myFunction() { 
    var str = "The rain in SPAIN stays mainly in the plain"; 
    var test = "ain"; 
    var re = "/"+test+"/gi"; 
    var res = str.match(re); 
    console.log(res); 
} 

Как я пытался не работал.

ответ

11

Используйте регулярок конструктор, как:

function myFunction() { 
    var str = "The rain in SPAIN stays mainly in the plain", 
     test = "ain", 
     re = new RegExp(test, 'gi'), 
     res = str.match(re); 

    console.log(res); 
} 
7

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

Если ваша переменная содержит специальные символы, лучше избегать их.

var re = new RegExp(test.replace(/(\W)/g, "\\$1"), "gi"); 
5

Да match() не работает с строковыми литералами

Вы можете использовать var re = new RegExp(test,"gi");

var str = "The rain in SPAIN stays mainly in the plain"; 
    var test = "ain"; 
    var re = new RegExp(test,"gi"); 
    var res = str.match(re); 
    console.log(res); 
5

Вы могли бы искали «динамические регулярные выражения», и вы бы нашли: Javascript Regexp dynamic generation from variables? или Use dynamic (variable) string as regex pattern in JavaScript которые оба описывают это очень хорошо.

+2

Это действительно должен быть комментарий, а не ответ. Или, возможно, этот вопрос должен быть отмечен как дубликат одного из связанных ответов? – RobG

+0

Я понятия не имею, как это можно сделать. Если вы скажете мне, я сделаю это для следующих дубликатов, которые я вижу. Но в большинстве случаев, когда я видел другие дубликаты, люди отвечали как «ответ», поскольку это был ответ на проблему. – eX0du5

+0

@ eX0du5 Возможно, вы видели это, но это не так, как это работает :) Если у вас достаточно репутации, вы можете увидеть опцию «Закрыть».Если вы этого не сделаете, оставьте комментарий, поясняющий, что это дубликат, и кто-то с достаточным количеством представителей будет голосовать за вас. – CodingIntrigue

5

Обратите внимание, что вы передаете строку match. Если мы последуем за documentation, это сделает new RegExp(test). Поэтому вам следует избегать строк / и /gi и добавлять соответствующие флаги в конструктор RegExp: конструктор по умолчанию не добавляет ни глобального поиска (g), ни поиска без учета регистра (i).

Таким образом, решение вашей проблемы:

var str = "The rain in SPAIN stays mainly in the plain"; 
var test = "ain"; 
var res = str.match(new RegExp(test, "gi")); 

Это будет возвратов:

Array [ "ain", "AIN", "ain", "ain" ] 

Примечание:

Форма только str.match(test, "gi"); работает в Firefox браузере, но осуждается и бросает консоль предупреждение от Firefox 39 (см. комментарий RGraham).

+0

Это не будет передавать флаги 'gi' в конструктор' RegExp', в соответствии с связанными документами. Он передает 'g' по умолчанию, но не' i' – CodingIntrigue

+0

@RGraham - вот почему я передаю '' gi '' '' str.match'. Если мы не передаем его, результатом будет просто 'Array [" ain "]': никакого глобального поиска и без учета регистра без учета регистра. Поэтому я бы сказал, что по умолчанию ничто не передается конструктору 'RegExp'. – TrapII

+1

Нет перегрузки для 'String.prototype.match', который принимает 2 аргумента. По крайней мере, в спецификации spec & in Chrome. Ваш код приводит к 'Array [" ain "]' в Chrome 42 – CodingIntrigue

Смежные вопросы