Комментирование регулярных выражений

Я пытаюсь прокомментировать регулярные выражения в JavaScript.

Кажется, много ресурсов о том, как удалить комментарии из кода с помощью регулярных выражений, но не на самом деле, как комментировать регулярные выражения в JavaScript, чтобы их было легче понять.

Любая помощь очень ценится!

Ответ 1

К сожалению, JavaScript не имеет подробного режима для литералов регулярного выражения, как это делают некоторые другие langauges. Вы можете найти это интересное, хотя.

Вместо любых внешних библиотек лучше всего использовать обычную строку и прокомментировать, что:

var r = new RegExp(
    '('      + //start capture
    '[0-9]+' + // match digit
    ')'        //end capture
); 
r.test('9'); //true

Ответ 2

В нескольких других языках (особенно Perl) есть специальный флаг x. Когда установлено, regexp игнорирует любые пробелы и комментарии внутри него. К сожалению, регулярные выражения javascript не поддерживают флаг x.

Отсутствие синтаксиса - единственный способ повысить читаемость - это соглашение. Mine должен добавить комментарий перед сложным регулярным выражением, содержащим его, как если бы у вас был флаг x. Пример:

/*
  \+?     #optional + sign
  (\d*)   #the integeric part
  (       #begin decimal portion
     \.
     \d+  #decimal part
  )
 */
var re = /\+?(\d*)(\.\d+)/;

Для более сложных примеров вы можете увидеть, что я сделал с помощью метода здесь и .

Ответ 3

Я бы предложил вам поставить регулярный комментарий над строкой с регулярным выражением, чтобы объяснить это.

У вас будет гораздо больше свободы.

Ответ 4

Хотя Javascript изначально не поддерживает многострочные и закомментированные регулярные выражения, достаточно просто создать что-то, что выполняет то же самое - использовать функцию, которая принимает (многострочную, закомментированную) строку и возвращает регулярное выражение из этой строки, без комментариев и новых строк.

Следующий фрагмент имитирует поведение флага x (" extended ") других разновидностей, который игнорирует все пробельные символы в шаблоне, а также комментарии, которые обозначены #:

function makeExtendedRegExp(inputPatternStr, flags) {
  // Remove everything between the first unescaped '#' and the end of a line
  // and then remove all unescaped whitespace
  const cleanedPatternStr = inputPatternStr
    .replace(/(^|[^\\])#.*/g, '$1')
    .replace(/(^|[^\\])\s+/g, '$1');
  return new RegExp(cleanedPatternStr, flags);
}


// The following switches the first word with the second word:
const input = 'foo bar baz';
const pattern = makeExtendedRegExp(String.raw'
  ^       # match the beginning of the line
  (\w+)   # 1st capture group: match one or more word characters
  \s      # match a whitespace character
  (\w+)   # 2nd capture group: match one or more word characters
');
console.log(input.replace(pattern, '$2 $1'));