Игнорирование пробелов в шаблонах регулярных выражений 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,''));
}