Javascript 查找正则表达式
是否有一种现有的算法可以在一行有效的JavaScript代码中查找所有文本正则表达式 鉴于文本正则表达式不能是多行的,我需要在一行代码中检测所有正则表达式,或者更具体地说,检测每个正则表达式的开始索引和结束索引(如果存在)Javascript 查找正则表达式,javascript,regex,Javascript,Regex,是否有一种现有的算法可以在一行有效的JavaScript代码中查找所有文本正则表达式 鉴于文本正则表达式不能是多行的,我需要在一行代码中检测所有正则表达式,或者更具体地说,检测每个正则表达式的开始索引和结束索引(如果存在) function enumRegex(textLine) { // magic happens here; } var testLine = 'var regEx1 = /one/; regEx2 = /two/;'; console.log(enumRegex(
function enumRegex(textLine) {
// magic happens here;
}
var testLine = 'var regEx1 = /one/; regEx2 = /two/;';
console.log(enumRegex(testLine));
预期输出:索引对数组(找到的每个正则表达式的开始和结束索引):
更新:玩了这个之后,我甚至不确定它是否会工作。因此,如果有人建议使用正则表达式来检测正则表达式,则需要一个实际有效的示例。我更希望看到一个算法。唯一阻止你做
/\/.+\/[a-z]*/g
,因为你的正则表达式测试是。。。首先,它将无法找到自己。它不喜欢漏掉的反斜杠
没问题
/\/(?:\\.|[^\/])+\/[a-z]*/g
那么这个正则表达式做什么呢
/
-这是正则表达式的开始。。。可能吧李>
- 后跟任意字符的反斜杠(这是我们的转义忽略逻辑,请注意,“任意字符”不包括换行符)
- 或任何不是正斜杠的字符
/
/\/((?:\\.|[^\/])+)\/([a-z]*)/g
现在,对于每个匹配,我们尝试从中创建一个regex对象:
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 false匹配='var string=“/trololol/”;'代码>
var falseMatch='//注释行带有类似于/regex的子字符串/derp'代码>
var false匹配='var number=8/2/2;'代码>(将
视为正则表达式)/2/
与简单的正则表达式相比,这些和更多需要更多的内容感知解析。1)使用正则表达式提取介于两者之间的内容/2)将所有提取的字符串馈送给正则表达式构造函数,并检查结果是否为正则表达式对象(如果馈送的内容不是有效的正则表达式,则会抛出一个语法错误),你需要一个解析器才能得到可靠的结果。算法已经在解析器的源代码中发布。这个问题最终会变成“解析器是如何工作的?”这太宽泛了,因此我投票将这个问题作为离题来结束。@vitaly-t这个问题的正确答案应该是“编写解析器”这会让你有足够的想法来合作。其他的一切(比如,为您编写一个实际的解析器)都会花费太多的精力,需要太多的细节(记住:我们不是来为您编写代码的)。因此,如果“编写语法分析器”对您来说不够清楚,那么您的问题本质上是“语法分析器如何工作?”或“我如何编写语法分析器?”这太宽泛了。在评估您的答案时,我只想再次强调,我只关注有效的JavaScript,我对无效的RegExp或无效的JavaScript一点也不感兴趣。但也感谢您考虑这些案例!:)@vitaly-t这是不使用递归正则表达式就无法实现的,JavaScript引擎不支持这一点。下一个最好的选择是找到可疑的正则表达式,并使用内置解析器对它们进行测试。在我的代码中,我已经将文本块、注释块和正则表达式彼此分离,因此您的解决方案比您想象的更接近我需要的:)一般来说,这是一个我已经接受的好答案。非常感谢你!我很困惑,为什么你会提出一个完整的解决方案,然后指出它不起作用的所有原因。正确答案就是你的最后一句话。
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;
}