【发布时间】:2013-11-20 19:37:04
【问题描述】:
有没有办法在 JavaScript 正则表达式中嵌入注释,例如 you can do in Perl?我猜没有,但我的搜索没有找到任何说明您可以或不可以的内容。
【问题讨论】:
标签: javascript regex comments
有没有办法在 JavaScript 正则表达式中嵌入注释,例如 you can do in Perl?我猜没有,但我的搜索没有找到任何说明您可以或不可以的内容。
【问题讨论】:
标签: javascript regex comments
您不能在正则表达式文字中嵌入注释。
您可以在传递给 RegExp 构造函数的字符串构造中插入 cmets:
var r = new RegExp(
"\\b" + // word boundary
"A=" + // A=
"(\\d+)"+ // what is captured : some digits
"\\b" // word boundary again
, 'i'); // case insensitive
但是正则表达式文字要方便得多(请注意我必须如何转义 \)我宁愿将正则表达式与 cmets 分开:只需将一些 cmets 放在您的正则表达式之前,而不是放在里面。
EDIT 2018:这个问题和答案已经很老了。 EcmaScript 现在提供了新的方法来处理这个问题,更准确地说是template strings。
例如我现在在节点中使用this simple utility:
module.exports = function(tmpl){
let [, source, flags] = tmpl.raw.toString()
.replace(/\s*(\/\/.*)?$\s*/gm, "") // remove comments and spaces at both ends of lines
.match(/^\/?(.*?)(?:\/(\w+))?$/); // extracts source and flags
return new RegExp(source, flags);
}
const regex = rex`
^ // start of string
[a-z]+ // some letters
bla(\d+)
$ // end
/ig`;
console.log(regex); // /^[a-z]+bla(\d+)$/ig
console.log("Totobla58".match(regex)); // [ 'Totobla58' ]
【讨论】:
现在有了the grave backticky things,你可以做一些内联的cmets。请注意,在下面的示例中,对匹配的字符串中不会出现的内容进行了一些假设,特别是关于空格。但我认为,如果您仔细编写process() 函数,您通常可以做出这样的有意假设。如果没有,可能有创造性的方法来定义正则表达式的小“迷你语言扩展”,以使其工作。
function process() {
var regex = new RegExp("\\s*([^#]*?)\\s*#.*$", "mg");
var output = "";
while ((result = regex.exec(arguments[0])) !== null ){
output += result[1];
}
return output;
}
var a = new RegExp(process `
^f # matches the first letter f
.* # matches stuff in the middle
h # matches the letter 'h'
`);
console.log(a);
console.log(a.test("fish"));
console.log(a.test("frog"));
这里是a codepen.
另外,对于 OP,只是因为我觉得有必要这么说,这很好,但如果您的结果代码与字符串连接一样冗长,或者您需要 6 个小时才能找出正确的正则表达式而且你是团队中唯一一个会费心使用它的人,也许你的时间有更好的用途......
我希望你知道我对你只有这么直率because I value our friendship。
【讨论】: