求解释一条正则

2014-06-18 23:19:48 +08:00
 xieguanglei
https://github.com/chjj/marked (一个把markdown转html的nodejs库)中用来匹配标题的。

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

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

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

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

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

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

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

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

(?:)表示的是非匹配捕获,(?:\n+|$) 的意思应该是匹配任意多个回车或者到结束
xieguanglei
2014-06-19 08:11:37 +08:00
@xcatliu 明白了,多谢!
xieguanglei
2014-06-19 08:12:06 +08:00
@freefcw 哈,明白了,多谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/118270

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX