查找正则表达式

时间:2015-12-26 12:40:02

标签: javascript regex

是否有现有的算法可以在一行有效的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?之后,我不确定它是否会奏效。因此,如果有人建议使用正则表达式来检测正则表达式,则需要一个实际可行的示例。我宁愿希望看到一个算法。

1 个答案:

答案 0 :(得分:0)

阻止你进行/\/.+\/[a-z]*/g作为正则表达式测试的唯一复杂因素是......好吧,对于初学者来说,它将无法找到自己。它不喜欢转义反斜杠。

不是问题。

/\/(?:\\.|[^\/])+\/[a-z]*/g

这个正则表达式做了什么?

  1. 寻找/ - 这是正则表达式的开始......可能!
  2. 寻找其中一个......
    • 反斜杠后跟任何字符(这是我们的逃避忽略逻辑,注意“任何字符”不包括换行符)
    • 或任何不是正斜杠的字符
  3. 找到表示正则表达式结束的/
  4. 查找附加到正则表达式文字的任何修饰符。
  5. 而且......完成了!如果这个正则表达式匹配的东西,那么它已经找到了一个看起来像正则表达式的东西。但是......这并不是说你找到了一个有效的正则表达式。为此,我们需要一些验证。

    首先,让我们捕获正则表达式和修饰符:

    /\/((?:\\.|[^\/])+)\/([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 /被视为正则表达式)

    这些和更多内容需要比简单正则表达式允许的更多内容感知解析。