我正在尝试在JavaScript中评论正则表达式。
似乎有很多关于如何使用正则表达式从代码中删除注释的资源,但实际上并不是如何在JavaScript中注释正则表达式,因此它们更容易理解。
非常感谢任何帮助!
答案 0 :(得分:14)
不幸的是,JavaScript并没有像其他语言那样对正则表达式文字进行详细模式。您可以找到this interesting, though。
代替任何外部库,最好的办法是使用普通字符串并注释:
var r = new RegExp(
'(' + //start capture
'[0-9]+' + // match digit
')' //end capture
);
r.test('9'); //true
答案 1 :(得分:3)
在其他几种语言(特别是Perl)中,有一个特殊的x
标志。设置后,正则表达式会忽略其中的任何空格和注释。遗憾的是,javascript regexp不支持x
标志。
缺乏语法,利用可读性的唯一方法是约定。我的目的是在棘手的正则表达式之前添加注释,包含它就像你有x标志一样。例如:
/*
\+? #optional + sign
(\d*) #the integeric part
( #begin decimal portion
\.
\d+ #decimal part
)
*/
var re = /\+?(\d*)(\.\d+)/;
答案 2 :(得分:1)
我建议你在正则表达式的行上面加上常规注释,以便解释它。
你将拥有更多的自由。
答案 3 :(得分:1)
虽然Javascript本身不支持多行和带注释的正则表达式,但构造完成相同功能的东西很容易-使用一个接受(多行,带注释的)字符串并返回正则表达式的函数该字符串中没有注释和换行符。
以下代码段模仿了其他样式的x
(“ extended”)标志的行为,该标志忽略了模式中的所有空白字符以及用{{1}表示的注释}:
#
通常,要在Javascript字符串中表示反斜杠,必须对每个文字反斜杠进行两次转义,例如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'));
。但是正则表达式通常使用许多反斜杠,而双转义可以使模式的可读性降低,因此在编写带有许多反斜杠的Javascript字符串时,最好使用str = 'abc\\def'
模板文字,它允许使用单个类型反斜杠实际上代表字面反斜杠,而无需额外的转义。
就像使用标准String.raw
修饰符一样,要匹配字符串中的实际x
,只需先对其进行转义即可,例如
#
foo\#bar # comments go here
请注意,要匹配文字空间字符(而不仅仅是任何空格字符),而在任何环境(包括上述环境)中使用// this function is exactly the same as the one in the first snippet
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
\# # match a hash character
(\w+) # 2nd capture group: match one or more word characters
`);
console.log(input.replace(pattern, '$2 $1'));
标志时,您必须转义开头x
,例如:
\
如果您想经常匹配空格字符,这可能会变得有些乏味,并使图案更难以阅读,这与不太希望双转义反斜杠类似。允许使用非转义的空格字符的一种可能的(非标准)修改将是仅去除行首和结尾处的空格,以及在^(\S+)\ (\S+) # capture the first two words
注释之前的空格:
#