今天折腾这么一个正则

  今天一天折腾了这么一个正则

new Regex(@"^!?\[((?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*)\]\s*\(\s*<?((?:[^()]|\((?<DEPTH>)|\)(?<-DEPTH>))+?(?(DEPTH)(?!)))>?(?:\s+([‘""])([\s\S]*?)\3)?\s*\)");

  话说这个正则是干什么用的,故事是这样的:

  很久很久以前

  我在markdownlite里面抄了个marked里面的正则

  一切都很好。

  突然,

  有用户报我们的markdown不对,

  什么情况?

  一问是link的处理有问题。

  是什么奇葩link那?

  打开一看,

  映入眼帘的是:

[hello](foo(bar).md)

  marked里面的正则会处理成:

<a href="foo(bar">hello</a>bar).md)

  确实bar后面都跟)了链接就到处为止了,

  看起来是用户内容有问题啊!

  再跑到github里面一试,

  傻眼了:

<a href="foo(bar).md">hello</a>

  吐血中。。。

  再试了很多case后,

  发现github只要在link target里面的的()是成对出现的就能work。

  于是就有了今天这个正则。

  这个复杂的正则需要这么去理解:

^                                           start of string
!?                                          ‘!‘ 0~1
\[                                          ‘[‘
((?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*)    group 1: text
\]                                          ‘]‘
\s*                                         white spaces
\(                                          ‘(‘
\s*                                         white spaces
<?                                          ‘<‘ 0~1
(                                           start group 2: link
    (?:                                     start non-capturing group
        [^()]                               any chararacter but ‘(‘ or ‘)‘
    |                                       or
        \((?<DEPTH>)                        ‘(‘ 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
\)                                          ‘)‘
时间: 2024-11-03 05:41:45

今天折腾这么一个正则的相关文章

随笔一个正则

正则匹配,一定要知道的是,它是一个字符一个字符进行匹配.这一点很重要. 匹配一个字符串$a = '12,33,4,5,6';这种一个数一个逗号的.或者就是一个数字. 知道正则的匹配规则,一个字符一个字符匹配.由于这个例子可以分组,那么开始分割,找到了分组条件是一个逗号一个数.第一个数要单拿出来. +号表示一个或者多个,*号表示0个或者多个 preg_match('/^\d+(,\d+)*$/', $a);// 注意php正则里没有g选项... 这个就可以匹配一个数字或者带有逗号的$a这种~ 正则

折腾了一个晚上的业余时间,终于把一块廉价的tftlcd连到了我的树莓派上

网上搜索了下型号,果然有老外用同样液晶屏在树莓派上,而且提供了内核驱动参数,在命令行modprobe一点问题都没有可以成功加载,这个过程半个小时就ok了,大部分时间都浪费了在启动时候加载内核的调试上 在/etc/modules添加内核后如果带参数肯定加载是被说找不到内核不带参数,fbtft的液晶屏幕内核驱动因为缺少参数不能加载. 在/etc/modprobe.d/创建conf后 ,复制加载内核驱动的那几行仍然失败.翻来覆去的调试终于tmd想明白了,man modprobe.d里面有介绍 手动调试

FreeSWITCH折腾笔记4——自己做一个TTS服务器

freeswitch原生支持的tts功能中文一般是使用的ekho,但是那合成的效果简直惨不忍睹,于是我想自己做一个TTS服务器. 首先是找到比较满意的TTS引擎,科大讯飞的效果当然是没话说,但是价格不菲,其他商业的引擎中文合成也不是很流畅,偶然发现windows7自带的合成引擎还算过得去,windows10带的合成引擎就更好了(有兴趣的可以先测试一下,直接在windows控制面板中的语音设置里面有测试,但是测试的中英文混读很蛋疼). 那么问题来了,怎么把这个引擎用到我的FS上边呢? 思路,deb

一个简单且完善的表单验证(毕老师的)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title&

如何成为一个真正在路上的Linuxer

Linux 是工具,却更像一个信仰. 注意:转载请注明出处: http://www.programfish.com/blog/?p=137  写在前面: 本文目的不是教你如何成为一个真正的Linuxer,也没有能力教你成为一个真正的linuxer,而是通过笔者的一些想法试图指引你真正踏上学习linux之路,成为一个真正意义的在路上的linuxer. 这有什么区别?是的,一个成熟的Linuxer能够游走于表面的命令提示符与内部代码细节实现之间,他们甚至也是linux内核源码的贡献者.这样 的能力是

JavaScript巩固与加强(五)正则

JavaScript巩固与加强(五) 目录 JavaScript巩固与加强(五)... 1 一.正则表达式... 3 1.历史起源... 3 2.什么是正则表达式... 3 3.应用场景... 3 4.快速入门... 4 1)查找一个字符串中是否具有数字"8". 4 2)查找一个字符串中是否具有数字... 4 3)查找一个字符串中是否具有非数字... 4 二.正则对象... 4 1.创建正则对象... 5 2.探讨正则对象从何而来... 5 3.匹配模式... 6 4.使用正则对象..

如何自己构建一个小型的Zoomeye----从技术细节探讨到实现

 0.概述 Zoomeye是个网络空间的搜索引擎,它不同于传统意义上的搜索引擎,而是一种可以搜索网络组件和网络设备的搜索引擎. 这种以各大组件指纹作为识别基础的数据平台,更多的是为了使得安全研究人员更好地评估漏洞的影响范围与其中隐含的数据模式. 1.架构分析 这是从网上搜索到的一张Zoomeye的后端架构图,主要分为调度框架.ES存储.UI呈现等模块.对于一次漏洞的评估,启动调度框架分配域名或者IP列表给扫描节点,节点完成任务后执行回调,做出自动化的效果其实也不是很难,从网上找个开源消息队列

Asp.Net MVC学习记录之“一个实体对象不能由多个 IEntityChangeTracker 实例引用”

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

浅谈 js 正则之 test 方法

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"