Игнорирование пробелов в шаблонах регулярных выражений Javascript?
из моего исследования похоже, что регулярные выражения Javascript не имеют встроенного эквивалента модификатора /x Perl или регулярных выражений .NET.IgnorePatternWhitespace модификатор. Они очень полезны, поскольку они могут сделать сложное регулярное выражение намного проще для чтения. Во-первых, я что-то пропустил, и есть ли встроенный Javascript, эквивалентный этим? Во-вторых, если нет, кто-нибудь знает хороший плагин jQuery, который реализует эту функциональность? Это стыд и позор сожмите мое сложное регулярное выражение в одну строку из-за очевидных ограничений регулярного выражения Javascript.
2 ответов
если я правильно вас понимаю, вы хотите добавить пробел, который не является частью регулярного выражения? Насколько я знаю, это невозможно с буквальным регулярным выражением.
пример:
var a = /^[\d]+$/
вы можете разбить регулярное выражение на несколько строк следующим образом:
var a = RegExp(
"^" +
"[\d]+" + // This is a comment
"$"
);
обратите внимание, что, поскольку теперь это обычная строка, вам нужно бежать \ with \\
или если у вас сложная:
var digit_8 = "[0-9]{8}";
var alpha_4 = "[A-Za-z]{4}";
var a = RegExp(
digit_8 +
alpha_4 + // Optional comment
digit_8
);
Update: использование временного массива для объединения регулярное выражение:
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(""));
к сожалению, в 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,''));
}