亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux中有哪些POSIX規范

發布時間:2021-06-24 14:19:04 來源:億速云 閱讀:289 作者:Leah 欄目:系統運維

Linux中有哪些POSIX規范,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

POSIX規范

常見的正則表達式記法,其實都源于Perl,實際上,正則表達式從Perl衍生出一個顯赫的流派,叫做PCRE(Perl Compatible Regular  Expression),『\d』、『\w』、『\s』之類的記法,就是這個流派的特征。但是在PCRE之外,正則表達式還有其它流派,比如下面要介紹的POSIX規范的正則表達式。

POSIX的全稱是Portable Operating System Interface for  uniX,它由一系列規范構成,定義了UNIX操作系統應當支持的功能,所以“POSIX規范的正則表達式”其實只是“關于正則表達式的POSIX規范”,它定義了BRE(Basic  Regular Expression,基本型正則表達式)和ERE(Extended Regular  Express,擴展型正則表達式)兩大流派。在兼容POSIX的UNIX系統上,grep和egrep之類的工具都遵循POSIX規范,一些數據庫系統中的正則表達式也符合POSIX規范。

BRE

在Linux/Unix常用工具中,grep、vi、sed都屬于BRE這一派,它的語法看起來比較奇怪,元字符『(』、『)』、『{』、『}』必須轉義之后才具有特殊含義,所以正則表達式『(a)b』只能匹配字符串  (a)b而不是字符串ab;正則表達式『a{1,2}』只能匹配字符串a{1,2},正則表達式『a\{1,2\}』才能匹配字符串a或者aa。

之所以這么麻煩,是因為這些工具的誕生時間很早,正則表達式的許多功能卻是逐步發展演化出來的,之前這些元字符可能并沒有特殊的含義;為保證向后兼容,就只能使用轉義。而且有些功能甚至根本就不支持,比如BRE就不支持『+』和『?』量詞,也不支持多選結構『(…|…)』和反向引用『\1』、『\2』…。

不過今天,純粹的BRE已經很少見了,畢竟大家已經認為正則表達式“理所應當”支持多選結構和反向引用等功能,沒有確實太不方便。所以雖然vi屬于BRE流派,但提供了這些功能。GNU也對BRE做了擴展,支持『+』、『?』、『|』,只是使用時必須寫成『\+』、『\?』、『\|』,而且也支持『\1』、『\2』之類反向引用。這樣,GNU的grep等工具雖然名義上屬于BRE流,但更確切的名稱是GNU  BRE。

ERE

在Linux/Unix常用工具中,egrep、awk則屬于ERE這一派,。雖然BRE名為“基本”而ERE名為“擴展”,但ERE并不要求兼容BRE的語法,而是自成一體。因此其中的元字符不用轉義(在元字符之前添加反斜線會取消其特殊含義),所以『(ab|cd)』就可以匹配字符串ab或者cd,量詞『+』、『?』、『{n,m}』可以直接使用。ERE并沒有明確規定支持反向引用,但是不少工具都支持『\1』、『\2』之類的反向引用。

GNU出品的egrep等工具就屬于ERE流(更準確的名字是GNU ERE),但因為GNU已經對BRE做了不少擴展,所謂的GNU  ERE其實只是個說法而已,它有的功能GNU BRE都有了,只是元字符不需要轉義而已。

下面的表格簡要說明了幾種POSIX流派的區別[1](其實,現在的BRE和ERE在功能上并沒有什么區別,主要的差異是在元字符的轉義上)。

幾種POSIX流派的說明

流派說明工具
BRE(、)、{、}都必須轉義使用,不支持+、?、|grep、sed、vi(但vi支持這些多選結構和反向引用)
GNU BRE(、)、{、}、+、?、|都必須轉義使用GNU grep、GNU sed
ERE元字符不必轉義,+、?、(、)、{、}、|可以直接使用,\1、\2的支持不確定egrep、awk
GNU ERE元字符不必轉義,+、?、(、)、{、}、|可以直接使用,支持\1、\2grep –E、GNU awk

為了方便查閱,下面再用一張表格列出基本的正則功能在常用工具中的表示法,其中的工具GNU的版本為準。

常用Linux/Unix工具中的表示法

PCRE記法vi/vimgrepawksed
*****
+\+\++\+
?\=\??\?
{m,n}\{m,n}\{m,n\}{m,n}\{m,n\}
\b *\< \>\< \>\< \>\y \< \>
(&hellip;|&hellip;)\(&hellip;\|&hellip;\)\(&hellip;\|&hellip;\)(&hellip;|&hellip;)(&hellip;|&hellip;)
(&hellip;)\(&hellip;\)\(&hellip;\)(&hellip;)(&hellip;)
\1 \2\1 \2\1 \2不支持\1 \2

注:PCRE中常用\b來表示“單詞的起始或結束位置”,但Linux/Unix的工具中,通常用\<來匹配“單詞的起始位置”,用\>來匹配“單詞的結束位置”,sed中的\y可以同時匹配這兩個位置。

POSIX字符組

在某些文檔中,你還會發現類似『[:digit:]』、『[:lower:]』之類的表示法,它們看起來不難理解(digit就是“數字”,lower就是“小寫”),但又很奇怪,這就是POSIX字符組。不僅在Linux/Unix的常見工具中,甚至一些變成語言中都出現了這些字符組,為避免困惑,這里有必要簡要介紹它們。

在POSIX規范中,『[a-z]』、『[aeiou]』之類的記法仍然是合法的,其意義與PCRE中的字符組也沒有區別,只是這類記法的準確名稱是POSIX方括號表達式(bracket  expression),它主要用在Unix/Linux系統中。POSIX方括號表示法與PCRE字符組的最主要差別在于:POSIX字符組中,反斜線\不是用來轉義的。所以POSIX方括號表示法『[\d]』只能匹配\和d兩個字符,而不是『[0-9]』對應的數字字符。

為了解決字符組中特殊意義字符的轉義問題,POSIX方括號表示法規定,如果要在字符組中表達字符](而不是作為字符組的結束標記),應當讓它緊跟在字符組的開方括號之后,所以POSIX中,正則表達式『[]a]』能匹配的字符就是]和a;如果要在POSIX方括號表示法中表達字符-(而不是范圍表示法),必須將它緊挨在閉方括號]之前,所以『[a-]』能匹配的字符就是a和-。

POSIX規范也定義了POSIX字符組,它近似等價于于PCRE的字符組簡記法,用一個有直觀意義的名字來表示某一組字符,比如digit表示“數字字符”,alpha表示“字母字符”。

不過,POSIX中還有一個值得注意的概念:locale(通常翻譯為“語言環境”)。它是一組與語言和文化相關的設定,包括日期格式、貨幣幣值、字符編碼等等。POSIX字符組的意義會根據locale的變化而變化,下面的表格介紹了常見的POSIX字符組在ASCII語言環境與Unicode語言環境下的意義,供大家參考。

POSIX字符組

POSIX字符組說明ASCII語言環境Unicode語言環境
[:alnum:]*字母字符和數字字符[a-zA-Z0-9][\p{L&}\p{Nd}]
[:alpha:]字母[a-zA-Z]\p{L&}
[:ascii:]ASCII字符[\x00-\x7F]\p{InBasicLatin}
[:blank:]空格字符和制表符[ \t][\p{Zs}\t]
[:cntrl:]控制字符[\x00-\x1F\x7F]\p{Cc}
[:digit:]數字字符[0-9]\p{Nd}
[:graph:]空白字符之外的字符[\x21-\x7E][^\p{Z}\p{C}]
[:lower:]小寫字母字符[a-z]\p{Ll}
[:print:]類似[:graph:],但包括空白字符[\x20-\x7E]\P{C}
[:punct:]標點符號[][!"#$%&'()*+,./:;<=>?@\^_`{|}~-][\p{P}\p{S}]
[:space:]空白字符[ \t\r\n\v\f][\p{Z}\t\r\n\v\f]
[:upper:]大寫字母字符[A-Z]\p{Lu}
[:word:]*字母字符[A-Za-z0-9_][\p{L}\p{N}\p{Pc}]
[:xdigit:]十六進制字符[A-Fa-f0-9][A-Fa-f0-9]

注1:標記*的字符組簡記法并不是POSIX規范中的,但使用很多,一般語言中都提供,文檔中也會出現。

注2:對應的Unicode屬性請參考本系列文章已經刊發過的關于Unicode的部分。

POSIX字符組的使用有所不同。主要區別在于,PCRE字符組簡記法可以脫離方括號直接出現,而POSIX字符組必須出現在方括號內,所以同樣是匹配數字字符,單獨出現時,PCRE中可以直接寫『\d』,而POSIX字符組就必須寫成『[[:digit:]]』。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

得荣县| 安新县| 株洲市| 台安县| 榆林市| 渝北区| 禹城市| 兴国县| 乌拉特后旗| 彩票| 丹棱县| 宜州市| 恭城| 安仁县| 锦州市| 博罗县| 阿瓦提县| 广平县| 屏东市| 湘潭县| 凤庆县| 军事| 奈曼旗| 平潭县| 衡南县| 马关县| 栾城县| 友谊县| 石城县| 沂南县| 铜陵市| 庆云县| 长乐市| 嘉定区| 德清县| 宁武县| 云龙县| 东方市| 神农架林区| 化州市| 靖江市|