1.什么是正則表達(dá)式
簡(jiǎn)單來(lái)說(shuō),就是使用一些特定的元字符來(lái)檢索燎孟、匹配禽作、替換符合規(guī)則的字符串。
2.正則表達(dá)式引擎
正則表達(dá)式就是一串符號(hào)揩页,程序需要去分析它旷偿,并且建立一個(gè)語(yǔ)法樹(shù),然后根據(jù)這個(gè)樹(shù)執(zhí)行程序爆侣。這個(gè)程序就叫做狀態(tài)機(jī)萍程。
(1)DFA【確定有限狀態(tài)自動(dòng)機(jī)】【時(shí)間復(fù)雜度O(n)】
(2)NFA【非確定有限狀態(tài)自動(dòng)機(jī)】【時(shí)間復(fù)雜度O(ns)】
對(duì)比一下,DFA執(zhí)行效率大于NFA兔仰。在編程語(yǔ)言里茫负,都是使用NFA。
3.那么正則是如何匹配的乎赴?簡(jiǎn)單梳理一下
text = "aabcab";
regex = "bc"
拿正則第一個(gè)字符去匹配b---a失敗忍法,b----a,失敗无虚。
然后是b---b缔赠,這時(shí)候匹配上了衍锚。
下一步就是拿第二個(gè)字符c---c 剛好匹配上了友题。這時(shí)候就成功了。
4.以上是一個(gè)簡(jiǎn)單的理想化的匹配戴质,NFA是如何回溯的呢度宦??
text = "abbc"
grex = "ab{1,3}c"
這個(gè)匹配的流程
首先正則第一個(gè)字符a---a 告匠,匹配成功
第二個(gè)b---b戈抄,成功。但是這時(shí)候
第三個(gè)還是b后专,因?yàn)閧1,3}划鸽,所有還是b---c.這時(shí)候就匹配失敗
這時(shí)候就發(fā)生了回溯。第三個(gè)b---指定的還是b.而不是C戚哎。
5.避免回溯問(wèn)題怎么辦裸诽?
(1)獨(dú)占模式
text=“abbc”
regex=“ab{1,3}+bc”
就是匹配不到就直接返回匹配結(jié)束。不存在回溯型凳。
(2)懶惰模式【加個(gè)丈冬?號(hào)】
text=“abc”
regex=“ab{1,3}?c”
只匹配一個(gè)b.如果后續(xù)不成功,也不回溯甘畅。
(3)減少分支
例如埂蕊,將“(abcd|abef)”替換為“ab(cd|ef)”
因?yàn)槿绻惶鎿Q往弓,ab可能會(huì)匹配多次。提取出來(lái)蓄氧,只需要匹配一次