grep 左匹配的問題

2021-08-30 08:56:03 字數 1394 閱讀 3150

把(?<=a)b(?=c)這裡面的a當成模式匹配,正確的是把b當做模式來匹配,a和c只是條件。模式匹配+條件成立才是匹配成功

這個就是(?<=a)和\k的區別

re\k 裡的re,不是零寬的

第乙個字元a,被『a\k』的a匹配成功,開始往後找字元,直到(?=b)

總結:\k不是零寬,(?<=)是零寬

grep -o (only的意識) 只取出匹配的字元而非全行

(?<=) :向後匹配 (?<=) 括號中必須固定長度,比如"\s",或者兩個空格,但是不能寫成\s或\s+ (必須固定長度,必需是零寬)

(?=) :向前匹配 括號中可以不用固定長度,可以寫成\s 或\s+;\s*和\s+的區別就不多說了。

但是需求是逗號和冒號之間可能還有空白符號,所以(?<=)就雞肋了,\k 裝逼神器出場了。

\k與(?<=)的區別:

1)
(?<=)把要捕獲的物件"xxoo"放在"?<=「的後面,eg:」(?<=xxoo)."

把要捕獲的物件"xxoo"放在"\k"的前面,eg "xxoo\k."

2)
\k也是向後匹配,但是他不用固定位置,即(環視),可以用\s*\k來表示向後匹配

eg:取出456

[root@local_game_server2 python_learn]# echo 「: 456,」|grep -po 『(?<=: ).(?=,)』

456[root@local_game_server2 python_learn]# echo 「: 456,」|grep -po '(?<=:\s).(?=,)』

456[root@local_game_server2 python_learn]# echo 「: 456,」|grep -po 『:\s*\k.*(?=,)』

456

"\s"代表空白字元

"\s"代表非空白字元

"."代表任意字元

"*"代表前邊字元重複0次或多次

"+"代表前邊字元重複1次或多次

"?"代表前邊字元重複0次或1次(懶惰匹配)

再來總結:\k和(?<=)

相同點:都可以用在grep –po中對字串匹配,且都是向左匹配

不同點:1)\k不是零寬,(?<=)是零寬 2)\k可以模糊量詞,(?<=)量詞要精確 3)寫法不一樣xxoo\k.,(?<=xxoo).

mysql取締最左匹配原則 最左匹配原則

一 這條sql語句select from dept where age 12 and name like a 雖然age條件在前,name在後,看似不滿足最左側原則,但這條語句在執行的過程中mysql優化器會將該條語句優化為select from dept where name like a and...

最左匹配原則

寫在前面 我在上大學的時候就聽說過資料庫的最左匹配原則,當時是通過各大部落格論壇了解的,但是這些部落格的侷限性在於它們對最左匹配原則的描述就像一些數學定義一樣,往往都是列出123點,滿足這123點就能匹配上索引,否則就不能。但是我覺得程式設計不是死記硬背,這個所謂最左匹配原則肯定是有他背後的原理的。...

Mysql最左匹配原則

看了好多部落格,講講自己的理解 索引的底層是一顆b 樹,那麼聯合索引當然還是一顆b 樹,只不過聯合索引的健值數量不是乙個,而是多個。構建一顆b 樹只能根據乙個值來構建,因此資料庫依據聯合索引最左的字段來構建b 樹。例子 假如建立乙個 a,b 的聯合索引,那麼它的索引樹是這樣的 可以看到a的值是有順序...