V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xieguanglei
V2EX  ›  Node.js

求解释一条正则

  •  
  •   xieguanglei · 2014-06-18 23:19:48 +08:00 · 3984 次点击
    这是一个创建于 3570 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://github.com/chjj/marked (一个把markdown转html的nodejs库)中用来匹配标题的。

    正则是 /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/

    如果去匹配 '##hello' (reg.exec(str)),可以得到 ['##hello', '##', 'hello'],请问 '##' 和 'hello' 是怎么得到的?

    正则也没看明白,是指:字符串开始,接任意个空格,接1~6个#,接任意空格,接1或更多个非\n字符,后面的就不明白是做什么用的了。
    10 条回复    2014-06-19 08:12:06 +08:00
    xinhugo
        1
    xinhugo  
       2014-06-18 23:38:56 +08:00
    抱歉,没明白你写的内容,不知道是你表达得不够清楚,还是我的理解能力有待提高啦。

    唯有建议你使用正则表达式测试工具,逐个字符测试一下,也许你就能明白了。

    正则表达式在线测试: http://tool.chinaz.com/regex/
    2code
        2
    2code  
       2014-06-18 23:41:52 +08:00
    分组
    xcatliu
        3
    xcatliu  
       2014-06-18 23:44:05 +08:00   ❤️ 1
    第一个问题,用 reg.exec 去匹配的时候,会返回一个数组,第一项是全部匹配的结果,后面依次是捕获组的结果,此例中就是括号中的匹配结果:(#{1,6}),([^\n]+?),最后一个括号是 ?: 开头,所以是非捕获组,不会捕获

    第二个问题,字符串开始,接任意个空格,接1~6个#,接任意空格,接1或更多个非\n字符,接任意空格,接任意多#,接任意多空格,然后后面必须是0或1个\n或一个行结束符
    xcatliu
        4
    xcatliu  
       2014-06-18 23:45:42 +08:00
    记得有个在线输入正则表达式,会生成一个流程图的网站,忘记收藏了。。。谁知道吗?
    Archangel_SDY
        5
    Archangel_SDY  
       2014-06-18 23:45:46 +08:00   ❤️ 1
    '##', 'hello' 是分组匹配出来的吧,后面的 (?:\n+|$) 表示匹配1个以上的 \n 或 $ 但不进入分组.

    参考:
    http://deerchao.net/tutorials/regex/regex.htm#grouping
    http://deerchao.net/tutorials/regex/regex.htm#backreference
    Archangel_SDY
        6
    Archangel_SDY  
       2014-06-18 23:47:21 +08:00   ❤️ 1
    xcatliu
        7
    xcatliu  
       2014-06-18 23:49:00 +08:00
    @Archangel_SDY 感谢!就是这个
    freefcw
        8
    freefcw  
       2014-06-18 23:51:31 +08:00   ❤️ 1
    建议楼主去了解一下正则的分组,对于()内的会标记为一个分组
    也就是说这个正则匹配的结果将如此解释

    ##hello 为完整的结果
    (#{1,6}) 是第一个分组,匹配1到6个#,也就是##
    ([^\n]+?) 是第二个分组,匹配一个到多个非\n,?表示此为非贪婪的,匹配到第一个就结束了,也就是hello

    (?:)表示的是非匹配捕获,(?:\n+|$) 的意思应该是匹配任意多个回车或者到结束
    xieguanglei
        9
    xieguanglei  
    OP
       2014-06-19 08:11:37 +08:00
    @xcatliu 明白了,多谢!
    xieguanglei
        10
    xieguanglei  
    OP
       2014-06-19 08:12:06 +08:00
    @freefcw 哈,明白了,多谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3256 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:06 · PVG 22:06 · LAX 07:06 · JFK 10:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.