JavaScript: некоторая проблема с интерпретацией компилятора // как комментарии в регулярном выражении - PullRequest
1 голос
/ 09 мая 2011

У меня есть это регулярное выражение для проверки телефонных номеров

^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$

Я выкопал это из моей библиотеки C # / vb, и теперь я хочу перевести это в javascript. Но у него есть синтаксическая ошибка (я подозреваю, что это что-то из-за символов //). моя попытка:

$IsPhone = function (input) {
  var regex = new window.RegExp("^$|^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$", "");
  return regex.test(input.trim());

};
alert($IsPhone("asd"));

Ответы [ 2 ]

4 голосов
/ 09 мая 2011

Ваша проблема не имеет ничего общего с комментариями.Вы просто смешиваете два разных способа создания объектов RegExp.

Когда вы создаете объект RegExp в коде JavaScript, вы либо записываете его как строковый литерал, передаваемый в конструктор RegExp, либо какрегулярное выражениеПоскольку строковые литералы поддерживают такие экранирующие последовательности, как \n и \", любой фактический обратный слеш в строке также должен быть экранирован.Таким образом, всякий раз, когда вам нужно экранировать метасимвол регулярного выражения, например ( или +, вы должны использовать две обратные косые черты, например:

var r0 = "^$|^(\\+?|(\\(\\+?[0-9]{1,3}\\))|)([ 0-9./-]|\\([ 0-9./-]+\\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9./-]|\\([ 0-9./-]+\\)))?$";
var regex0 = new RegExp(r0, "");

Косая черта не имеетособое значение, для регулярных выражений или строк.Единственная причина, по которой вам когда-либо приходится избегать косых черт, заключается в том, что они используются в качестве разделителя для литералов регулярных выражений .Вы используете обратную косую черту, чтобы избежать прямой косой черты, как вы используете метасимволы регулярных выражений, такие как \( или \+, или саму обратную косую черту: \\.Вот регулярное выражение вашего регулярного выражения:

var regex1 = /^$|^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.\/-]|\([ 0-9.\/-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.\/-]|\([ 0-9.\/-]+\)))?$/;
1 голос
/ 20 мая 2011

из Ошибки при переводе регулярных выражений из .NET в javascript

Символ обратной косой черты в JavaScript Строка является escape-символом, поэтому обратная косая черта у вас в строке избегают следующего символа для строка, а не для обычного выражение. Так прямо возле начало, в вашем "^ (+ ?, Обратная косая черта там просто ускользает от + для строка (которая ему не нужна), и то, что видит регулярное выражение, это просто сырье + повторять нечего. Отсюда и ошибка.

...