Комментирование регулярных выражений
Я пытаюсь прокомментировать регулярные выражения в 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'));