公司使用的markdown解析库一直存在一些解析问题,最近修复了。Markdown解析主要是使用正则表达式。中间补了一些相关的知识,这里整理一下。什么是正则表达式正则表达式就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。一个简单的例子:使用字符串“a”来验证字符串s是否为“a”,如s.match("a")。简而言之,它有以下功能:验证字符串是否符合指定的特征,比如验证它是否是一个合法的电子邮件地址。查找字符串,从长文本中查找符合指定特征的字符串,比查找固定字符串更灵活。替换字符串,比普通的基于字符串的替换更灵活。基本规则普通字符字母、数字、汉字、下划线及其后面没有具体定义的标点符号均为“普通字符”。表达式中的普通字符,在匹配字符串时,匹配相同的字符。例如:表达式“a”,匹配字符串“abcde”时,匹配的内容为:“a”。转义字符一些不方便书写的字符,使用在前面加“\”的方法。常见的如:\r:回车\n:换行符\t:制表符\:“\”本身此外,还有一些标点符号在正则化中有特殊用途。前面加“\”后,表示该符号本身。例如:^、"字符需要写成"\^"和"$"。例如\^:匹配^符号本身\$:匹配$符号本身\.:匹配小数点。其匹配规则与普通字符串相同,如“\^”匹配“a^bc”中的“^”。'多个字符'匹配\d:任意数字,0~9中的任意一个\w:任意字母或数字或下划线,即A~Z、a~z、0~9中的任意一个,_s:任意一个ofblankcharactersincludingspaces,tabs,andformfeeds.:小数点可以匹配除换行符以外的任何字符。例如:表达式“\dtest\d”匹配“1test2”。除了正则表达式自带的“多字符”匹配外,还可以通过方括号[]进行自定义。使用[]包含一系列字符,可以匹配其中的任何一个。使用[^]包含一系列字符以匹配其中字符以外的任何字符。例如:[123]匹配“1”或“2”或“3”;[^abc]匹配除“a”、“b”和“c”之外的任何字符。这里需要注意的是,在使用[]时,只有那些会改变字符组含义的才需要进行转义。必须转义反斜杠。方括号必须转义。“^”开头必须转义,其他的“-”必须转义即使是特殊字符也不需要转义,如:[aeiou][$.*+?{}()|][abc^123-]numberofmatches"Modification"放在"modifiedregularexpression"后面,可以匹配多次。例如:{n}:表达式重复n次,例如:“\d{2}”等同于“\d\d”。{m,n}:表达式最少重复m次,最多重复n次,例如:“a{1,3}”可以匹配“a”或“aa”或“aaa”。{m,}:表达式至少重复m次,例如:“\d{2,}”可以匹配“12”、“123”、“12345678”。?:匹配表达式0次或1次,相当于{0,1},例如:“a[b]?”可以匹配“a”、“ab”。+:表达式至少出现一次,相当于{1,},例如:“a+”可以匹配“a”、“aa”、“aaa”。*:表达式没有出现或出现次数不限,相当于{0,},例如:“ab”可以匹配“a”、“ab”、“abb”。特殊符号^:匹配字符串开头,不匹配任何字符,这里如果使用(?m)模式,则匹配每行开头。例如:“^aaa”不能匹配“xxxaaaxxx”,但可以匹配“aaaxxx”。$:匹配字符串的结尾,不匹配任何字符,这里如果使用(?m)模式,则匹配每行的结尾。例如:“aaa$”不能匹配“xxxaaaxxx”,但可以匹配“xxxaaa”。\b:匹配单词边界,即单词和空格之间的位置,不匹配任何字符。它类似于“^”和“$”,本身不匹配任何字符,但它要求其位置在匹配结果中的左右两侧,其中一个是“\w”范围,另一个是非“\w”范围。.例如:“.\b.”匹配“@@abc”的“@a”。此外,还有一些符号可以影响表达式内部子表达式之间的关系:|:左右表达式之间的“或”关系,匹配左边或右边。():修改匹配个数时,括号内的表达式可以整体修改;当得到匹配结果时,可以单独得到括号中表达式匹配的内容。例如:“(ab\s*)+”匹配“hi,ababab”中的“ababab”。进阶规则贪心与非贪心匹配在使用修改匹配次数的特殊符号时,有几种方式表示同一个表达式可以匹配不同的时间,如:"{m,n}","{m,}","?","*","+",具体匹配的个数取决于匹配的字符串。这种无限重复匹配的表达式,在匹配过程中总是匹配尽可能多的。例如,文本“axxxaxxxa”、“(a)(\w+)”,其中“\w+”将匹配“xxxaxxxa”,而“(a)(\w+)(a)”将匹配“xxxaxxx”。可以看出,在匹配“\w+”时,总是匹配尽可能多的符合其规则的字符。虽然在第二个例子中,它没有匹配到最后一个“a”,但这是为了整个表达式匹配成功。同理,尽量匹配带""和"{m,n}"的表达式,带"?"的表达式能配不配的时候也尽量匹配。这种匹配原则称为“贪心”模式。非贪心模式指的是加一个“?”在修饰匹配次数的特殊符号后面加号,这样匹配次数不定的表达式尽量少匹配,能匹配或不能匹配的表达式尽量匹配。不匹配。这种匹配原则也称为“宽松”模式。如果少匹配会导致整个表达式匹配不上,类似于贪心模式,非贪心模式会最少匹配一些,使整个表达式匹配成功。例如,文本“axxxaxxxa”、“(a)(\w+?)”,其中“\w+”将只匹配一个“x”。当匹配到反向引用表达式时,表达式引擎会记录括号“()”所包含的表达式所匹配的字符串。在获取匹配结果时,可以单独获取括号中表达式匹配的字符串。当以一定的边界搜索,但要获取的内容不包括边界时,必须使用括号来指定所需的范围。例如:“
