Игнорирование пробелов в шаблонах регулярных выражений Javascript?
Из моего исследования похоже, что регулярные выражения Javascript не имеют встроенного эквивалента модификатора Perl/x или .NET RegexOptions.IgnorePatternWhitespace. Они очень полезны, поскольку они могут облегчить чтение сложного регулярного выражения. Во-первых, я что-то пропустил, и есть ли встроенный эквивалент Javascript? Во-вторых, если этого не происходит, знает ли кто-нибудь о хорошем плагине jQuery, который будет реализовывать эту функциональность? Жаль, что нужно сжать мое сложное регулярное выражение в одну строку из-за явных ограничений регулярного выражения Javascript.
Ответы
Ответ 1
Если вы правильно поняли, что хотите добавить пробел, который не является частью регулярного выражения?
Насколько я знаю, это невозможно с литералом regexp.
Пример:
var a = /^[\d]+$/
Вы можете разбить регулярное выражение в нескольких строках следующим образом:
var a = RegExp(
"^" +
"[\\d]+" + // This is a comment
"$"
);
Обратите внимание, что поскольку теперь это нормальная строка, вам нужно выйти\с\\
Или, если у вас сложный:
var digit_8 = "[0-9]{8}";
var alpha_4 = "[A-Za-z]{4}";
var a = RegExp(
digit_8 +
alpha_4 + // Optional comment
digit_8
);
Обновление: использование временного массива для конкатенации регулярного выражения:
var digit_8 = "[0-9]{8}";
var alpha_4 = "[A-Za-z]{4}";
var a = RegExp([
digit_8,
alpha_4, // Optional comment
digit_8,
"[0-9A-F]" // Another comment to a string
].join(""));
Ответ 2
К сожалению, в ES5 такого варианта нет, и я подозреваю, что он вряд ли когда-либо будет в RegExp
литералах, потому что они уже очень трудно разобрать, а разрывы строк сделают их еще более двусмысленными.
Если вам нужно простое экранирование и подсветка синтаксиса литералов RegExp
, вы можете присоединиться к ним, воспользовавшись свойством source
. Это не идеально, но ИМХО менее плох, чем падение до конца:
new RegExp(
/foo/.source +
/[\d+]/.source +
/bar/.source
);
В ES6 вы можете создать свою собственную строку шаблона:
regexp`
foo
[\d+]
bar
`;
function regexp(parts) {
// I'm ignoring support for ${} placeholders for brevity,
// but full implementation should escape them.
// Note that `.raw` allows use of \d instead of \\d.
return new RegExp(parts.raw.join('').replace(/\s+/g,''));
}