2012-06-01 2 views
0

У меня есть следующее регулярное выражение в JavaScriptRegex терпит неудачу в JavaScript

var reg = new RegExp("^[(]?[2-9]\d{2}[)]?[\-. :]?[2-9]\d{2}[\-. :]?\d{4}$"); 
return this.optional(element) || (reg.test(value)); 

в моем коде reg.test (значение) возвращать ложь даже на правильные значения: например, 222 222 2222 или 222-222-2222. Все тестеры регулярных выражений (особенно this один, который вызывает те же методы) показывают, что регулярное выражение соответствует выражению. В чем проблема?

ответ

6

Попробуйте это:

var reg = /^[(]?[2-9]\d{2}[)]?[\-. :]?[2-9]\d{2}[\-. :]?\d{4}$/; 
return this.optional(element) || (reg.test(value)); 

Или также:

var reg = new RegExp("^[(]?[2-9]\\d{2}[)]?[\\-. :]?[2-9]\\d{2}[\\-. :]?\\d{4}$"); 
return this.optional(element) || (reg.test(value)); 
+0

Поиск этого очень долгое время! Не знал, что нам нужно было удвоить использование специальных символов, таких как '\ s' ->' \\ s' :) – JustBasti

+0

Большое спасибо, попробовал много, не понял \ должен быть заменен на \\ – Elaine

+0

Как вы правильно избежать двойной кавычки? (") Так как \" внутри строкового литерала ускользает от него, но в отношении соответствия шаблона \\ "приводит к тому, что ваш скрипт становится недействительным? –

4

\ s проглатывается строковым литералом.

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

var reg = /^[(]?[2-9]\d{2}[)]?[\-. :]?[2-9]\d{2}[\-. :]?\d{4}$/; 
2

Я вижу одну потенциальную причину неприятностей: если вы» создавая новое регулярное выражение с помощью функции RegExp, вам придется дважды сбрасывать обратную косую черту - один раз для JavaScript, и один раз для механизма RegEx.

Вы можете проверить, если это причиняет неприятность, делая

var reg = /^[(]?[2-9]\d{2}[)]?[\-. :]?[2-9]\d{2}[\-. :]?\d{4}$/; 
1

Вы принимаете регулярное выражение в виде строки, так что все вхождений \d должен быть \\d, потому что, когда строка регулярного выражения передаются в интерпретатор \d символа не интерпретируются как \ и d но просто d добавив дополнительный слэш избегает других косых черт, так что \\d интерпретируются как \ и d. Также я предлагаю другое изменение, [(] следует заменить на \\(, потому что класс символов содержит только один символ и поэтому не имеет смысла.

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