Javascript 查找正则表达式

Javascript 查找正则表达式,javascript,regex,Javascript,Regex,是否有一种现有的算法可以在一行有效的JavaScript代码中查找所有文本正则表达式 鉴于文本正则表达式不能是多行的,我需要在一行代码中检测所有正则表达式,或者更具体地说,检测每个正则表达式的开始索引和结束索引(如果存在) function enumRegex(textLine) { // magic happens here; } var testLine = 'var regEx1 = /one/; regEx2 = /two/;'; console.log(enumRegex(

是否有一种现有的算法可以在一行有效的JavaScript代码中查找所有文本正则表达式

鉴于文本正则表达式不能是多行的,我需要在一行代码中检测所有正则表达式,或者更具体地说,检测每个正则表达式的开始索引和结束索引(如果存在)

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;
    }