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