我正在解析一些JavaScript代码,需要在其中获取所有正则表达式。文字符号/\/(.(?:[^\/])|\\)+\/[gmi]*/gi
看起来不错,但在某些情况下它的工作原理不正确。
例如,对于此代码:
html = html.replace(/\</g, '<').replace(/\>/g, '>').replace(/\&/g, '&');
match()给出了两个愚蠢的结果:/\</g, '<' ).replace( /
和/\&/g
我似乎无法使其发挥作用。
答案 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