起因是同學找我問怎么用正則表達式獲得——比如說12.3億元中的“億”,3千萬元的“千萬”。然后我試了很久,直接用在線測試工具測的,發(fā)現(xiàn)零寬斷言里的(?<=exp)一直不起作用……后來發(fā)現(xiàn)應該是js不支持這個……還好他用的是python我就直接用python試了發(fā)現(xiàn)是支持的TUT而且我并不會python完全是百度了命令硬來。
一般來說大家平時用正則表達式都是得到帶有匹配內容的結果(描述的有點亂),比如說other?content!other 用\?(.*?)! 匹配的結果就是 ?content! 是帶有"?!"的。如果我想只得到content那應該怎么寫呢? 那就要用到零寬斷言里的(?<=exp) 和 (?=exp)
關于(?<=exp) 和 (?=exp)的介紹如下:
(?=pattern)
正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。
(?<=exp),也叫零寬度正回顧后發(fā)斷言
格式:(?<=pattern2)pattern1
匹配這樣的字符串
a)字符串本身匹配pattern1
b)字符串前面的內容匹配pattern2
如果概括的去理解(不一定完全符合原理),就是content(?=pattern)就是得到符合后面跟著pattern的content,(?<=pattern2)content 就是得到前面跟著pattern2的content。兩個一起用的話就匹配到那些前面符合pattern2后面跟著pattern的content。感覺是在繞口令orz。想要弄得更清楚可能要去研究下正則引擎的匹配行為。
于是我們得到正則表達式
(?<=\?)[\s\S]*(?=\!)
<code>[\s\S]*</code>匹配任意內容,<code>(?<=?)</code>表示前面是問號,<code>(?=!)</code>表示后面是感嘆號。
下面這個是獲得12.3億元中的“億”,3千萬元的“千萬”的正則表達式。
(?<=[0-9])[\u4e00-\u9fa5]+?(?=\u5143)