代码之家  ›  专栏  ›  技术社区  ›  Alex Gordon

我们是否曾经使用正则表达式来查找正则表达式?

  •  -1
  • Alex Gordon  · 技术社区  · 14 年前

    假设我有一根很长的绳子。字符串在随机位置有正则表达式。我能用正则表达式找到正则表达式吗?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Brian McCutchon    10 年前

    (假设您正在寻找一个JavaScript regexp文本,由 / .)

    / ,但这可能并不总是regexp。例如,这样的搜索将返回 /2 + 3/ 弦的 var myNumber = 1/2 + 3/4 . 这意味着您必须知道正则表达式之前发生了什么。regexp前面应该不是变量或数字。这些是我能想到的情况:

    /regex/;
    var myVar = /regex/;
    myFunction(/regex/,/regex/);
    return /regex/;
    typeof /regex/;
    case /regex/;
    throw /regex/;
    void /regex/;
    "global" in /regex/;
    

    在某些语言中,您可以使用lookbehind,它可能看起来像这样(未经测试!):

    (?=<^|\n|[^\s\w\/]|\breturn|\btypeof|\bcase|\bthrow|\bvoid|\bin)\s*\/(?:\\\/|[^\/\*\n])(?:\\\/|[^\/\n])*\/
    

    但是,JavaScript不支持这一点。我建议模仿lookbehind,将regexp中与文本本身匹配的部分放在捕获组中并访问它。我所知的所有情况都可以通过以下regexp进行匹配:

    (?:^|\n|[^\s\w\/]|\breturn|\btypeof|\bcase|\bthrow|\bvoid|\bin)\s*(\/(?:\\\/|[^\/\*\n])(?:\\\/|[^\/\n])*\/)
    

    注意 :此正则表达式有时会在注释中导致误报。

    如果还想获取修饰符(例如。 /regex/gim

    (?:^|\n|[^\s\w\/]|\breturn|\btypeof|\bcase|\bthrow|\bvoid|\bin)\s*(\/(?:\\\/|[^\/\*\n])(?:\\\/|[^\/\n])*\/\w*)
    

    如果缺少任何可能后跟regexp文字的保留字,只需将其添加到第一组的末尾: |\b 关键字

    类似的

    var codeString = "function(){typeof /regex/;}";
    var searchValue = /(?:^|\n|[^\s\w\/]|\breturn|\btypeof|\bcase|\bthrow)\s*(\/(?:\\\/|[^\/\*\n])(?:\\\/|[^\/\n])*\/)/g;
        // the global modifier is necessary!
    var match = searchValue.exec(codeString); // "['typeof /regex/','/regex/']"
    match = match[1]; // "/regex/"
    

    更新
    我刚刚修复了regexp中有关转义斜杠的一个错误,该错误会导致它只得到 /\/ /\/hello/

    更新 4月6日
    void in . 如果你看第一个代码块中的语法着色,你不能因为一开始没有包含这个而责怪我太多,因为即使堆栈溢出也没有。

        2
  •  3
  •   Community CDub    7 年前

    “正则表达式”是什么意思? aaaa This is also a regular expression . 如果您指的是正则表达式文字,则可能需要以下内容: /\/(?:[^\\\/]|\\.)*\// (改编自 here ).

    / . 在Perl或sed中,它们可以从您想要的任何内容开始。从本质上说,你所做的是有风险的,而且可能不会适用于所有情况。

        3
  •  1
  •   Steven de Salas Alexander Bollaert    14 年前

    这不是最好的办法。

        4
  •  1
  •   lorenzog    14 年前

    是的,如果你知道是否(以及如何!)您的regex是分隔的。比如说,你的字符串是

    aaaaa...aaa/b/aaaaa
    

    其中“b”是由字符分隔的“正则表达式” / (这是一个近乎基本的场景);您需要做的是扫描字符串以查找预期的分隔符,提取分隔符之间的任何内容(注意转义字符),然后应该进行设置。

    这个, 如果 如果 aaa/b/aaa/c/aaa/d )

    但是,我怀疑您正在寻找一个“一般规则”,以找到任何字符串,一旦解析,将产生一个有效的正则表达式(假设我们讨论的是POSIX regexp--try man re_format 如果你的睡眠不足。如果是这种情况,您可以尝试给定字符串的每个长度的每个可能的子字符串,并将其馈送给regexp解析器以确保语法正确性。不过,您还没有证明regexp的有效性,即 它们实际上是匹配的。

    如果这就是你想要做的,我强烈建议你找到另一种方法或者更好地解释你在这里想要完成的事情。