谈到正则表达式谈到正则表达式(Commenting Regular Expressions)

2019-05-12 06:50发布

我想在JavaScript中评正则表达式。

人们似乎对如何删除使用正则表达式从代码注释很多资源,但实际上没有怎么评论在JavaScript正则表达式,使他们更容易理解。

任何帮助是极大的赞赏!

Answer 1:

不幸的是,JavaScript并没有对正则表达式文字详细模式像其他一些汉语语言做。 您可能会发现这个有趣的,虽然 。

代替任何外部库的,最好的办法就是使用一个普通的字符串,并评论说:

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


Answer 2:

在其他几种语言(尤其是Perl的),有特殊的x标志。 设置时,正则表达式忽略了这里面的任何空白和注释。 可悲的是,JavaScript的正则表达式不支持x标志。

缺乏语法,利用可读性的唯一途径是惯例。 我的是棘手的正则表达式之前,添加评论,含有它,如果你有过的X标志。 例:

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

对于更复杂的例子,你可以看到我所用技术做在这里和这里 。



Answer 3:

我建议你把一个普通注释的行上述正则表达式,以解释。

你将有更多的自由。



Answer 4:

虽然使用Javascript本身并不支持多行和注释的正则表达式,它是很容易建立的东西,完成同样的事情 - 用一个函数,它在(多行,评论)字符串,并从该字符串返回一个正则表达式,SANS的意见和换行符。

以下代码段模仿其他口味的行为x (“ 扩展 ”)标志,它忽略的图案的所有空格字符以及注释,其被表示为与#

 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' 。 不过正则表达式经常使用许多反斜杠,双转义可以使图案更可读,所以写一个JavaScript字符串有很多反斜杠时,它的使用是一个好主意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

如果你想经常匹配空格字符,这样可以得到一个有点乏味,使格局难以阅读,类似是逃避双反斜线怎么不是非常理想。 一种可能的(非标准)的修改,以允许未转义空格字符。将一个之前只剥离出在开始位和线的端,并且空格#评论:

 function makeExtendedRegExp(inputPatternStr, flags) { // Remove the first unescaped `#`, any preceeding unescaped spaces, and everything that follows // and then remove leading and trailing whitespace on each line, including linebreaks const cleanedPatternStr = inputPatternStr .replace(/(^|[^\\]) *#.*/g, '$1') .replace(/^\s+|\s+$|\n/gm, ''); console.log(cleanedPatternStr); 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+) (\w+) # capture the first two words `); console.log(input.replace(pattern, '$2 $1')); 



文章来源: Commenting Regular Expressions