Сопоставить динамическую строку с помощью регулярных выражений - PullRequest
10 голосов
/ 27 января 2010

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

var searchStr = 'width'; 
var strRegExPattern = '/'+searchStr+'\b/'; 
"32:width: 900px;".match(new RegExp(strRegExPattern,'g'));

Ответы [ 4 ]

20 голосов
/ 27 января 2010

Пожалуйста, не ставьте '/' при передаче строки в опции RegExp

Следующий будет хорошо

var strRegExPattern = '\\b'+searchStr+'\\b'; 
"32:width: 900px;".match(new RegExp(strRegExPattern,'g'));
4 голосов
/ 27 января 2010

Вы смешиваете два способа создания регулярных выражений в JavaScript. Если вы используете литерал регулярного выражения, / - это разделитель регулярных выражений, модификатор g следует сразу же после закрывающего разделителя, а \b - escape-последовательность для границы слова:

var regex = /width\b/g;

Если вы создаете его в виде строкового литерала для конструктора RegExp, вы исключаете разделители регулярных выражений, передаете модификаторы в виде второго строкового аргумента и должны удваивать обратные слэши в escape-последовательностях регулярных выражений:

var regex = new RegExp('width\\b', 'g');

То, как вы это делаете, \b преобразуется в символ возврата, прежде чем он достигнет компилятора регулярных выражений; Вы должны избежать обратной косой черты, чтобы пройти через строково-буквенную обработку escape-последовательности JavaScript. Или используйте литерал регулярного выражения.

3 голосов
/ 27 января 2010

Правильный инструмент для этой работы - не регулярное выражение, а String.indexOf:

var str = '32:width: 900px;',
    search = 'width',
    isInString = !(str.indexOf(search) == -1); 

// isInString will be a boolean. true in this case

Документация: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/String/indexOf

0 голосов
/ 27 января 2010

Обратите внимание, что «\\ b» - это одиночная косая черта в строке, за которой следует буква «b», «\ b» - это управляющий код \b, который не существует и сворачивается в «b».

Также рассмотрите возможность экранирования метасимволов в строке, если вы хотите, чтобы они соответствовали только их буквальным значениям.

var string = 'width';
var quotemeta_string = string.replace(/[^$\[\]+*?.(){}\\|]/g, '\\$1'); // escape meta chars
var pattern = quotemeta_string + '\\b';
var re = new RegExp(pattern);
var bool_match = re.test(input); // just test whether matches
var list_matches = input.match(re); // get captured results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...