table of contents
other languages
other sections
REGEX(7) | Miscellaneous Information Manual | REGEX(7) |
NAME¶
regex - POSIX 1003.2 正則表達式DESCRIPTION¶
正則表達式 (``RE''s), 在 POSIX 1003.2 中定義,包含兩種類型: 新式 REs (基本上指的是 egrep 使用的那些,1003.2 稱其為 ``extended'' REs 也就是「擴展的REs」) 和舊式 REs (指的是 ed(1) 中的那些,1003.2 稱之為 ``basic'' REs 也就是「基本的REs」). 舊式 REs 的存在僅僅是為了向後和一些舊程式保持相容;在最後將加以討論。 1003.2 對 RE 語法和語義的某些方面沒有做強制規定; `(!)' 記號標示了這些內容,它們可能不能完全移植到其他 1003.2 實現當中。 一個(新式的) RE 正則表達式是一個(!) 或多個非空(!) branches 分支,以 `|' 分隔。 它匹配任何匹配其中一個分支的符號串。 一個 branch 分支是一個(!) 或多個 pieces 片段連結而成。 符號串首先要匹配它的第一個片段,接下來剩餘部分再匹配第二個片段,以此類推。 一個 piece 片段是一個 atom 原子,其後可能包含一個(!) `*', `+', `?', 或者 bound 量詞。 一個原子加上 `*' 匹配零個或多個這個原子的匹配構成的序列。 一個原子加上 `+' 匹配一個或多個這個原子的匹配構成的序列。 一個原子加上 `?' 匹配零個或一個這個原子的匹配。 一個 bound 量詞是 `{' 後面跟一個無符號十進制整數,可能還會跟一個 `,', 可能還會再跟一個無符號十進制整數,然後以 `}' 結束。 整數的大小必須在 0 和 RE_DUP_MAX (255(!)) 之間(包含邊界值)。 如果給出了兩個數字,那麼第一個決不能比第二個大。 一個原子的量詞中如果只有一個數字而沒有逗號的話,就匹配 i 個這個原子的匹配構成的序列。 一個原子的量詞中如果只有一個數字並且有逗號的話,就匹配 i 個或多個這個原子的匹配構成的序列。 一個原子的量詞中如果包含兩個數字 i 和 j 的話,就匹配 i 到 j 個這個原子的匹配構成的序列。 一個原子是一個包含在 `()' 中的正則表達式 (這將匹配這個正則表達式匹配的符號串), 一個空的 `()' (匹配空串), 一個 bracket expression (方括號表達式,參見下面), `.' (匹配任何字符), `^' (匹配行首的空字符串), `$' (匹配行尾的空字符串), 一個 `\' 加上下列字符之一 `^.[$()|*+?{\' (匹配這個字符,忽略它的任何特殊意義), 一個 `\' (加上任何其他字符(!) 匹配那個字符,忽略它的任何特殊意義,就好像 `\' 不存在(!)), 或者是一個字符,沒有特殊意義 (匹配它本身)。 一個 `{' 後面是一個非數字的字符時,是一個普通的字符而不是量詞的開始(!)。 以 `\' 來結束一個 RE 是非法的。 一個 bracket expression 方括號表達式是一個字符的列表,包含在 `[]' 當中。 它一般匹配列表中的任何一個字符 (有特殊情況)。 如果這個列表以 `^' 開始,它將匹配 不在 列表中的任何字符 (下面還會講到特殊情況)。 如果列表中的兩個字符以 `-' 分隔,可以表示字母表中這兩個字符之間(包括這兩個字符)所有的字符。 例如,ASCII 字符表中 `[0-9]' 匹配任何數字。 不能(!) 用一個字符作為定義兩個字符范圍的端點,就像這樣 `a-c-e'。 字符范圍是與字母表順序相關的,可移植的程式不應使用它們。 要在列表中包含一個字面的(沒有特殊含義的) `]',可以把它放在首位(後面可能要加上一個`^')。 要在列表中包含一個字面的 `-',可以把它放在首位或末尾,或者讓它作為一個字符范圍的末端點。 要以一個字面的 `-' 作為字符范圍的起始,可以將它放在 `[.' 和 `.]' 當中, 使得它成為一個 collating element (歸並元素,參見下面)。 特殊情況除了這些,還有使用 `[' 的組合(參見下一段)。所有其他特殊字符,包括 `\' 在內,在方括號表達式中都失去了它們的特殊含義。 方括號表達式中,一個包含在 `[.' 和 `.]' 中的歸並元素 (collating element,一個字符,一個視為一體的字符序列, 或者一個代表著上述兩類的歸並序列名稱) 代表著這個歸並元素所包含的字符序列。 這個序列被視為方括號表達式的一個元素。 因此一個包含著多字符歸並元素的方括號表達式可以匹配多於一個的字符。 例如,如果這個歸並序列包含一個歸並元素 `ch',那麼 正則表達式 `[[.ch.]]'*c' 可以匹配 `chchcc' 的前五個字符。 方括號表達式中,一個包含在 `[=' 和 `=]' 中的歸並元素是一個等價類,代表著 等價於它的所有歸並元素 (也包括它自身)包含的字符的序列。 (如果沒有其他等價的歸並元素,就把它與括號分隔符是 `[.' 和 `.]' 時同樣看待。) 例如,如果 o 和 ^ 是一個等價類的成員,那麼 `[[=o=]]',`[[=^=]]' 還有 `[o^]' 都是同義詞。 一個等價類不能(!) 是一個字符范圍的末端點。 方括號表達式中,包含在 `[:' 和 `:]' 中的一個 character class(字符類) 代表著這個 字符類中的所有字符的列表。 標準的字符類名稱是:alnum digit punct alpha graph space blank lower upper cntrl print xdigit
SEE ALSO 參見¶
regex(3) POSIX 1003.2, section 2.8 (Regular Expression Notation).BUGS¶
同時使用兩種 REs 是不明智的。 目前的 1003.2 規約稱,如果右括號 `)' 沒有對應的 `(' 那麼視為普通字符;這個規定是一個筆誤,將來會改正。 避免使用它。 向後引用是糟糕的設計,是高效的實現中要面對的主要問題。 另外還會產生晦澀的語法 (?`a\(\(b\)*\2\)*d' 可以匹配 `abbbd' 嗎?)。 避免使用它們。 1003.2 對於忽略大小寫的匹配的規定也不明確。 上面給出的定義 ``one case implies all cases'' 是當前各實現者的共識,被當作正確的語法。 詞邊界的語法醜陋得讓人難以接受。AUTHOR 作者¶
This page was taken from Henry Spencer's regex package.[中文版維護人]¶
袁乙鈞 <bbbush@163.com>[中文版最新更新]¶
2004.02.24《中國linux論壇man手冊頁翻譯計劃》:¶
http://cmpp.linuxforum.net1994-02-07 |