我在编写一个代码高亮的插件,求一个正则表达式,把 javascript 的正则形式(即:/abc/g 的正则形式)识别出来。
例如,把【var rstr = /(['"]).*?\1/gm;】
中的【/(['"]).*?\1/gm】
识别出来。
多谢啦!
ringa_lee2017-04-10 14:48:03
js 的代碼高亮我寫過一個純正則表達式版:http://segmentfault.com/blog/bum/1190000000764811
https://bumfo.github.io/high.html
代碼和 Demo 都在裏面了。包括了對正則表達式等的完整識別。
順便說一句,想要正確匹配 js 中的正則表達式,先得正確匹配其它部分。
正則表達式部分是我做得最久的一項。原因:
var a = b/a/g;
顯然 sf 的編輯器沒有正確高亮 @Integ 。。。
var d = {e:/* I'm comment */ /a/g};
sf 的編輯器再次高亮失敗!
/ a /g; /*/
失敗!這也是正確的 js 代碼,雖然無意義。
a */ a /g; /* aaa */;
這回,後面的註釋也變成正則了??
var a = /\//g;
哎,這個都錯誤匹配,不應該啊。。。
var a = /\/*a*/g;
同上。。。
顯然,在不進行完整語義識別的情況下,想要正確識別 js 中的正則表達式文法是不可能滴!
大家讲道理2017-04-10 14:48:03
(?<!\/)\/(?:[^\/\\\n\r]|\\.)+\/[a-z]*
用了个零宽度正回顾后发断言
就是前面的(?<!\/)
, 表示匹配块前面不能有/
,避免匹配到注释//abc/
的情况
测试 Python
>>> reg = '(?<!\/)\/(?:[^\/\\\n\r]|\\.)+\/[a-z]*'
>>> str = 'var rstr = /([\'"]).*?\\1/gm; //abc/'
>>> re.findall(reg, str)
['/([\'"]).*?\\1/gm']
如果是用Javascript,忽略吧,Javascript不支持后发断言,要避免匹配到注释,就只能优先匹配是否是注释