search

Home  >  Q&A  >  body text

javascript - 代码高亮,求一个正则表达式

我在编写一个代码高亮的插件,求一个正则表达式,把 javascript 的正则形式(即:/abc/g 的正则形式)识别出来。
例如,把【var rstr = /(['"]).*?\1/gm;】中的【/(['"]).*?\1/gm】识别出来。
多谢啦!

巴扎黑巴扎黑2901 days ago430

reply all(3)I'll reply

  • ringa_lee

    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 中的正則表達式文法是不可能滴!

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 14:48:03

    \/.+\/[gim]*
    

    reply
    0
  • 大家讲道理

    大家讲道理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不支持后发断言,要避免匹配到注释,就只能优先匹配是否是注释

    reply
    0
  • Cancelreply