我想在JavaScript中评正则表达式。
人们似乎对如何删除使用正则表达式从代码注释很多资源,但实际上没有怎么评论在JavaScript正则表达式,使他们更容易理解。
任何帮助是极大的赞赏!
我想在JavaScript中评正则表达式。
人们似乎对如何删除使用正则表达式从代码注释很多资源,但实际上没有怎么评论在JavaScript正则表达式,使他们更容易理解。
任何帮助是极大的赞赏!
不幸的是,JavaScript并没有对正则表达式文字详细模式像其他一些汉语语言做。 您可能会发现这个有趣的,虽然 。
代替任何外部库的,最好的办法就是使用一个普通的字符串,并评论说:
var r = new RegExp(
'(' + //start capture
'[0-9]+' + // match digit
')' //end capture
);
r.test('9'); //true
在其他几种语言(尤其是Perl的),有特殊的x
标志。 设置时,正则表达式忽略了这里面的任何空白和注释。 可悲的是,JavaScript的正则表达式不支持x
标志。
缺乏语法,利用可读性的唯一途径是惯例。 我的是棘手的正则表达式之前,添加评论,含有它,如果你有过的X标志。 例:
/*
\+? #optional + sign
(\d*) #the integeric part
( #begin decimal portion
\.
\d+ #decimal part
)
*/
var re = /\+?(\d*)(\.\d+)/;
对于更复杂的例子,你可以看到我所用技术做在这里和这里 。
我建议你把一个普通注释的行上述正则表达式,以解释。
你将有更多的自由。
虽然使用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'));