是否有现有的算法可以在一行有效的JavaScript代码中查找所有文字正则表达式?
鉴于文字正则表达式不能是多行的,我需要检测单行代码中的所有正则表达式,或者更具体地说 - 每个正则表达式的开始和结束索引(如果它们存在)。
function enumRegex(textLine) {
// magic happens here;
}
var testLine = 'var regEx1 = /one/; regEx2 = /two/;';
console.log(enumRegex(testLine));
预期输出:索引对数组(找到每个RegEx的开始和结束索引):
[{13,17},{29,33}]
更新:玩完这个:Is there a regular expression to detect a valid regular expression?之后,我不确定它是否会奏效。因此,如果有人建议使用正则表达式来检测正则表达式,则需要一个实际可行的示例。我宁愿希望看到一个算法。
答案 0 :(得分:0)
阻止你进行/\/.+\/[a-z]*/g
作为正则表达式测试的唯一复杂因素是......好吧,对于初学者来说,它将无法找到自己。它不喜欢转义反斜杠。
不是问题。
/\/(?:\\.|[^\/])+\/[a-z]*/g
这个正则表达式做了什么?
/
- 这是正则表达式的开始......可能!/
而且......完成了!如果这个正则表达式匹配的东西,那么它已经找到了一个看起来像正则表达式的东西。但是......这并不是说你找到了一个有效的正则表达式。为此,我们需要一些验证。
首先,让我们捕获正则表达式和修饰符:
/\/((?:\\.|[^\/])+)\/([a-z]*)/g
现在,对于每个匹配,我们尝试从中创建一个正则表达式对象:
isValid = true;
try {
new RegExp(match[1], match[2]);
// pass suspect regex as first argument, modifiers as second
}
catch(e) {
isValid = false;
}
所以你的最终代码可能看起来像......
function enumRegex(textLine) {
var parser = new RegExp("/((?:\\\\.|[^/])+)/([a-z]*)","g");
// note that rules for escaping are very different in new RegExp than with literals
var match, results = [];
while( match = parser.exec(textLine)) {
try {
new RegExp(match[1],match[2]);
}
catch(e) {
continue;
}
results.push(match[0]);
}
return results;
}
值得注意的是,这远非完美无缺。问题包括:
var falseMatch = 'var string = "/trololol/";';
var falseMatch = '// comment line with a /regex-like substring/derp';
var falseMatch = 'var number = 8 / 2 / 2;';
(/ 2 /
被视为正则表达式)这些和更多内容需要比简单正则表达式允许的更多内容感知解析。