正規表示式中.*和*的區別

正規表示式中.*和*的區別

我有一個名為“test”的文件,其中包含

linux
Unixlinux
Linuxunix
it's linux
l...x

現在當我使用時grep '\<l.*x\>',它匹配:

linux
it's linux
l...x

但當我使用時grep '\<l*x\>',它只匹配:

l...x,但根據參考指南,當使用 * 時,前面的項目將匹配零次或多次,即它應該匹配以 'l' 開頭並以 'x' 結尾的任何內容

誰能解釋為什麼它沒有顯示出預期的結果或我是否理解錯誤?

答案1

符號 (.*)

正規表示式 .* 和 * 中的 * 指的是計數,而不是每個字元的字元數,更準確地說,它的意思是“零個或多個”。此外,方法'任何單一字元'

所以當你把它們放在一起時你會得到'零個或多個任意字元'。例如像這樣的字串:

  • 作業系統
  • 林恩恩克斯
  • lnx
  • 嗨Linux
  • 勒克斯

將匹配為<l.*x>.最後一項很重要,它表明.*也無法匹配。

符號 (*)

正如我所說,單獨使用 * 是一個計數器。所以當你把它放在一個字母後面時,例如'l'* 是說'零個或多個 l'

請注意,如果我們 grep for l*x,這將匹配l...x,但可能不是您想像的那樣。

% echo "l...x" | grep "l*x"
l...x

它匹配尾隨的“x”。除了「x」前面有「x」之外,「l」與匹配的原因無關'零個或多個 l'

答案2

如果您想匹配以“l”開頭並以“x”結尾的任何內容,請嘗試正規表示式“l.*x”。這裡 ”。” 「*」和「*」分別是表示單一有效字元和長度至少為零的字元的特殊字元。這裡“*”之前是“.”,所以無論什麼都可以代替“.”。根據上面“*”的定義重複。

答案3

對於 shell(例如 bash),當小丑用於匹配檔案名稱時,*?是字元本身 - 它們代表字元。

另一方面,對於正規表示式,*, ?, {n,m}(出現範圍)和+( egreponly) 本身什麼都不是。它們總是引用前一個字符/原子 - 無論這是一個實際字符(例如L5),.(小丑)可以代表任何字符,一系列字符(例如[a-f])或多個字符的模式(僅限egrep;例如(abba)- 其中“ abba」被視為一個單位)。因此,*?本身並不代表任何東西,而是告訴我們前一個角色(對於任何一個或一組被視為一個單位的人來說可能是一個小丑)應該重複多少次。

一旦您記住了 shell 和正規表示式使用*和 的方式之間的區別?,它就應該明白了。

所以對於正規表示式:

  • .- 準確地表示任意字元的一次出現
  • a..a- 匹配兩個 a 和其間任意類型的兩個字符
  • .*- 符合任何字元出現 0 次、1 次或多次
  • B*- 符合 0、1 或多次出現的“B”

相關內容