评论正则表达式

时间:2013-03-17 16:34:56

标签: javascript regex comments

我正在尝试在JavaScript中评论正则表达式。

似乎有很多关于如何使用正则表达式从代码中删除注释的资源,但实际上并不是如何在JavaScript中注释正则表达式,因此它们更容易理解。

非常感谢任何帮助!

4 个答案:

答案 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+)/;

对于更复杂的示例,您可以看到我使用该技术herehere所做的工作。

答案 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 注释之前的空格:

#