日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

對話 UNIX,第 9 部分: 正則表達式( 三 )


可實現(xiàn)這一技巧 。regex 操作符 |(豎線)表示備選項,因此 this|that 匹配字符串 this 或字符串 that 。因此,^(bat|Bat|cat|Cat) 表示“行首緊跟 bat、Bat、cat 或 Cat之一 。當然,可以使用 grep -i 來簡化該 regex,這樣可以忽略大小寫,從而將命令簡化為:
grep -i -E '^(bat|cat)' heroes.txt
匹配“bat、“Bat、“cat或“Cat的另一個方法是使用 [ ](方括號)集合 操作符 。如果將一組字符放在一個集合中,則可以匹配那些字符中的任意一個 。(您可以將集合 看作是字符備選項的簡寫法 。)
例如,命令行:
grep -E '^[bcBC]at' heroes.txt
與以下命令生成的結(jié)果相同:
grep -E '^(bat|Bat|cat|Cat)' heroes.txt
您可以再次使用 -i 將 regex 簡化為 ^[bc]at 。
而且,還可以使用 -(連字符)操作符在集合中指定包含的字符范圍 。例如,用戶名通常以字母開頭 。假定要在提交給您的服務(wù)器的 Web 表格中驗證這樣的用戶名,可以使用類似于 ^[A-Za-z] 的 regex 。此 regex 表示“字符串的開頭后緊跟任意大寫字母 (A-Z) 或任意小寫字母 (a-z) 。順便說明一下,[A-z] 與 [A-Za-z] 作用相同 。
還可以在集合中混合使用范圍和單個字符 。regex [A-MXYZ] 將匹配任意大寫的 A-M、X、Y 和 Z 。
并且,如果希望反轉(zhuǎn)集合(即排除集合中的任意字符),可以使用特殊集合 [^ ] 并包含要排除的范圍或字符 。以下是反轉(zhuǎn)集合的示例 。要查找所有名稱中包含 at 的超級英雄,并排除 Dark Knight 和 Batman,請鍵入:
grep -i -E '[^b]at' heroes.txt
此命令生成:
Catwoman
Black Cat
由于某些集合需要經(jīng)常使用,所以設(shè)計出簡化符號以代替大量字符 。例如,集合 [A-z0-9_] 十分常用,因此可以簡寫為 w 。與此類似,操作符 W 是集合 [^A-z0-9_] 的簡寫 。還可以使用符號 [:alnum:] 代替 w,使用 [^[:alnum:]] 代替 W 。
順便說明一下,w(以及同義詞 [:alnum:])是特定于區(qū)域的,而 [A-z0-9_] 即表示字母 A-z、數(shù)字 0-9 和下劃線 。如果要開發(fā)國際化應(yīng)用程序,請使用區(qū)域特定的格式以使代碼可以在許多區(qū)域之間移植 。
跟我一起重復(fù):重復(fù),重復(fù),重復(fù)
到目前為止,已經(jīng)介紹了字面值、位置和兩種備選項操作符 。僅使用這些內(nèi)容,就可以匹配大多數(shù)具有可預(yù)測 長度的模式 ?,F(xiàn)在回到用戶名,通過以下 regex 命令可以確保每個用戶名以字母開頭并緊跟恰好七個字母或數(shù)字:
[a-z][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]
但是這樣有點笨拙 。而且,它只匹配恰好八個字符的用戶名 。它不會匹配三到八個字符之間的名稱,這通常也是有效的用戶名 。
正則表達式還可以包括重復(fù)修飾符 。重復(fù)修飾符可以指定數(shù)量,如沒有、一個、多個、一個或多個,零或一個、五到十個,以及恰好三個 。重復(fù)修飾符必須與其他模式組合,修飾符本身沒有含義 。
例如,regex:
^[A-z][A-z0-9]{2,7}$
可以實現(xiàn)前面描述的用戶名過濾功能 。用戶名 是以字母開頭,后面緊跟至少兩個,但不超過七個字母或數(shù)字的字符串,并且緊跟字符串結(jié)尾 。
此處的位置定位點非常重要 。如果沒有兩個位置操作符,則會錯誤地接受任意長度的用戶名 。為什么呢?請考慮 regex:
^[A-z][A-z0-9]{2,7}
此命令辨別:字符串是否以字母開頭并緊跟二到七個字母?但是它未提到終止條件 。因此,字符串 samuelclemens 滿足條件,但是它的長度顯然超出了有效用戶名的范圍 。與此類似,省略開始定位點 ^,或同時省略兩個定位點將分別匹配以類似 munster1313 結(jié)束或包含該字符串的字符串 。如果必須匹配特定的長度,請記得在要求的模式的開頭和結(jié)尾分別加上分隔符 。

推薦閱讀