JS:在代码中查找regexp文字

时间:2014-03-02 19:03:00

标签: javascript regex parsing

我正在解析一些JavaScript代码,需要在其中获取所有正则表达式。文字符号/\/(.(?:[^\/])|\\)+\/[gmi]*/gi看起来不错,但在某些情况下它的工作原理不正确。

例如,对于此代码:

html = html.replace(/\</g, '&lt;').replace(/\>/g, '&gt;').replace(/\&/g, '&amp;');

match()给出了两个愚蠢的结果:/\</g, '&lt;' ).replace( //\&/g

我似乎无法使其发挥作用。

1 个答案:

答案 0 :(得分:3)

使用单个正则表达式无法避免这种情况。你现在偶然发现了一个单一的案例,你的正则表达式没有正确处理,但还有很多甚至更多。当多行或单行注释中有一个开放的正则表达式文字,或者在字符串文字中出现/时,你的正则表达式就会中断。

唯一可靠的解决方法是解析JavaScript,并检查解析器(或词法分析器)产生的令牌流。

要开始使用,请参阅:JavaScript parser in JavaScript

  

user3371384写道:

     

我不关心评论,因为我在获取regexp文字之前删除它们,同样关于字符串。

无论如何,还有更多的角落案例:

var e = 8, f = 4, g = 2;
// ...
var x = e/f/g; // your regex will match `/f/g` as a regex literal
  

user3371384写道:

     

在许多代码解析器中使用相同的algorythm:find斜杠,然后找到下一个斜杠(如果之前没有反斜杠),里面的所有字符都是regexp。

这可能是,但这是一个非常不准确的算法(正如你在上面给出的反例中所见)。还有可能会破坏正则表达式的速记/=

无论如何,你似乎已经决定使用正则表达式......

您将.置于错误的位置:您只想在反斜杠之后匹配任何字符。试试这个:

/\/([^\/]|\\.)+\/[gmi]*/gi