今天一天折腾了这么一个正则
new Regex(@"^!?\[((?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*)\]\s*\(\s* )|\)(?<-DEPTH>))+?(?(DEPTH)(?!)))>?(?:\s+(['""])([\s\S]*?)\3)?\s*\)");
话说这个正则是干什么用的,故事是这样的:
很久很久以前
我在markdownlite里面抄了个marked里面的正则
一切都很好。
突然,
有用户报我们的markdown不对,
什么情况?
一问是link的处理有问题。
是什么奇葩link那?
打开一看,
映入眼帘的是:
[hello](foo(bar).md)
marked里面的正则会处理成:
hellobar).md)
确实bar后面都跟)了链接就到处为止了,
看起来是用户内容有问题啊!
再跑到github里面一试,
傻眼了:
吐血中。。。
再试了很多case后,
发现github只要在link target里面的的()是成对出现的就能work。
于是就有了今天这个正则。
这个复杂的正则需要这么去理解:
^ start of string!? '!' 0~1\[ '['((?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*) group 1: text\] ']'\s* white spaces\( '('\s* white spaces ) '(' with depth++ | or \)(?<-DEPTH>) ')' with depth-- ) end non-capturing group +? lazy 1~ (?(DEPTH)(?!)) require depth = 0) end group 2: link>? '>' 0~1(?: start non-capturing group \s+ white spaces (['"]) group 3: quote ' or " ([\s\S]*?) group 4: title \3 ref group 3)? end non-capturing group 0~1\s* white spaces\) ')'