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