Provided by:
manpages-zh_1.5-1_all 
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 語法和語義的某些方惆S有做強制規定; `(!)' 記號標示了這些內容,它-
怚i能不能完全移植到其他 1003.2 實現當中。
一(新式的) RE 正則表達式是一(!) 或多茷D空(!) branches 分支,以 `|'
分隔。 它匹配任何匹配其中一茪壑銂熔顫髡瞗C
一 branch 分支是一(!) 或多 pieces 片段連結而成。 符號串漸-
n匹配它的第一茪軉q,接下來剩餘部分再匹配第二茪軉q,以此類推。
一 piece 片段是一 atom 鴗l,其後可能包含一(!) `*', `+', `?', 或者
bound 量詞。 一适子加上 `*' 匹配零茤峖h茬o适子的匹配構成的序列。 一-
鴗l加上 `+' 匹配一茤峖h茬o适子的匹配構成的序列。 一适子加上 `?' 匹配零-
茤峇@茬o适子的匹配。
一 bound 量詞是 `{' 後掘礞@茧L符號十進制整數,可能還會跟一 `,',
可能還會再跟一茧L符號十進制整數,然後以 `}' 結束。 整數的大小必須在 0
和 RE_DUP_MAX (255(!)) 之間(包含邊界)。 如果給出了兩蚍r,那麼第一-
茖M不能比第二茪j。 一适子的量詞中如果只有一蚍r而沒有逗號的話,就匹配
i 茬o适子的匹配構成的序列。 一适子的量詞中如果只有一-
蚍r並且有逗號的話,就匹配 i 茤峖h茬o适子的匹配構成的序列。 一-
鴗l的量詞中如果包含兩蚍r i 和 j 的話,就匹配 i 到 j 茬o-
鴗l的匹配構成的序列。
一适子是一茈]含在 `()' 中的正則表達式 (這將匹配這-
茈翰h表達式匹配的符號串), 一茠讀 `()' (匹配空串), 一 bracket
expression (方括號表達式,參見下), `.' (匹配任何字符), `^' (匹配行-
漯漯臟r符串), `$' (匹配行尾的空字符串), 一 `\' 加上下列字符之一
`^.[$()|*+?{\' (匹配這茼r符,忽略它的任何特殊意義), 一 `\'
(加上任何其他字符(!) 匹配那茼r符,忽略它的任何特殊意義,就好像 `\'
不存在(!)), 或者是一茼r符,沒有特殊意義 (匹配它本)。 一 `{' 後惇O一-
茷D數字的字符時,是一荋雲q的字符而不是量詞的開始(!)。 以 `\' 來結束一
RE 是非法的。
一 bracket expression 方括號表達式是一茼r符的列表,包含在 `[]' 當中。
它一般匹配列表中的任何一茼r符 (有特殊情況)。 如果這茼C表以 `^'
開始,它將匹配 b 列表中的任何字符 (下掄棶|講到特殊情況)。
如果列表中的兩茼r符以 `-' 分隔,可以表示字母表中這兩茼r符之間(包括這兩-
茼r符)所有的字符。 例如,ASCII 字符表中 `[0-9]' 匹配任何數字。 不能(!)
用一茼r符作為定義兩茼r符S圍的端點,就像這樣 `a-c-e'。 字符-
S圍是與字母表順序相關的,可移植的程式不應使用它怴C
n在列表中包含一茼r悸(沒有特殊含義的) `]',可以把它放在漲(後悼i能-
n加上一罛^')。 n在列表中包含一茼r悸 `-',可以把它放在-
漲鴝峊膚嚏A或者讓它作為一茼r符S圍的末端點。 n以一茼r悸 `-' 作為字符-
S圍的起始,可以將它放在 `[.' 和 `.]' 當中, 使得它成為一 collating
element (歸並元素,參見下)。 特殊情況除了這些,還有使用 `['
的組合(參見下一段)。所有其他特殊字符,包括 `\'
在內,在方括號表達式中都失去了它怐滲S殊含義。
方括號表達式中,一茈]含在 `[.' 和 `.]' 中的歸並元素 (collating
element,一茼r符,一茧欓陘@體的字符序列, 或者一茈N表著上-
z兩類的歸並序列名稱) 代表著這蚋k並元素所包含的字符序列。 這-
荍C被視為方括號表達式的一茪葛嚏C 因此一-
茈]含著多字符歸並元素的方括號表達式可以匹配多於一茠漲r符。
例如,如果這蚋k並序列包含一蚋k並元素 `ch',那麼 正則表達式
`[[.ch.]]'*c' 可以匹配 `chchcc' 的前太字符。
方括號表達式中,一茈]含在 `[=' 和 `=]' 中的歸並元素是一茧本驨,代表著
等價於它的所有歸並元素 (也包括它自)包含的字符的序列。
(如果沒有其他等價的歸並元素,就把它與括號分隔符是 `[.' 和 `.]'
時同樣看待。) 例如,如果 o 和 ^ 是一茧本驨的成,那麼
`[[=o=]]',`[[=^=]]' 還有 `[o^]' 都是同義詞。 一茧本驨不能(!) 是一-
茼r符S圍的末端點。
方括號表達式中,包含在 `[:' 和 `:]' 中的一 character class(字符類)
代表著這 字符類中的所有字符的列表。 標準的字符類名稱是:
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit
它怚N表著 wctype(3) 定義的字符類。 一 locale(語言環境)
可能會提供其他字符類。 一茼r符類不能用作一茼r符S圍的末端點。
方括號表達式還有兩種特殊的情況(!) : 方括號表達式 `[[:<:]]' 和
`[[:>:]]' 分別匹配一茧的開始和結尾的空字符串。 一 word (詞)是一 word
character (成詞字符) 的序列,並且前後都沒有成詞字符。 一 word
character (成詞字符) 是一 alnum 字符 (在 wctype(3) 中有定義) 或者是一-
茪U劃線。 這是一蚋X展,與 POSIX 1003.2 相容但沒有寫入正文,在需-
n移植到其他系統中的軟體中應當小心使用。
如果一 RE 可以匹配一茼r符串的多茪ㄕP的字串時,RE 選擇匹配最前悸漱@荂C
如果這 RE 匹配的子串有相同的起始點,RE 選擇匹配最長的一荂C
子表達式也匹配最長的字串,使得整茪t的字串最長,RE 中前
的子表達式比後悸漱l表達式優先級高。
注意高級的子表達式比組成它的子表達式優先級n高。
匹配長度以字符來p算,而不是歸並元素。 空字符串被認為比沒有匹配-
n長。例如,`bb*' 匹配 `abbbc' 的中間三茼r符;
`(wee|week)(knights|nights)' 匹配 `weeknights' 的全部十茼r符; `(.*).*'
匹配 `abc',其中括號中的子表達式匹配所有這三茼r符; `(a*)*' 來和 `bc'
匹配時,括號中的子表達式和整 RE 都匹配空字符串。
如果指定了 case-indepentent
忽略大小寫的匹配,效果是字母表中的大小寫區別似乎都消失了。 如果一-
茼r母可能以兩種情況出現,假如它出現在方括號表達式之外,實際上被替換成了一-
茈]含 所有情況的方括號表達式,例如 `x' 成為了
`[xX]';如果它出現在方括號表達式之內, 那麼它的所有形式都被加入到這-
茪雓A號表達式之內,因此例如 `[x]' 等同於 `[xX]',還有 `[^x]' 成為了
`[^xX]'。
對 RE 的長度沒有強制的制。需-
n可移植的程式不應當使用長於256字節的正則表達式,
因為特定的實現可以不接受這種 RE,但是仍然是 POSIX 相容的。
過時的 (``basic'') 正則表達式在很多地方有不同之處。`|',`+' 和 `?'
是普通的字符, 並且沒有和它拑本貜漸\能。量詞的分隔符是 `\{' 和
`\}',`{' 和 `}' 本足O普通的字符。 嵌套的子表達式使用的括號是 `\(' 和
`\)',`(' 和 `)' 本足O普通的字符。 `^' 是一荋雲q的字符,除非是 RE
的第一茼r符,或者(!) 一茯A號中的子表達式的第一茼r符。 `$' 是一-
荋雲q的字符,除非是 RE 的最後一茼r符,或者(!) 一-
茯A號中的子表達式的最後一茼r符。 `*' 是一荋雲q的字符,如果它出現在 RE
的開始,或者一茯A號中的子表達式的開始(其後一般是一 `^')。
最後,還有一類 atom 鴗l,一 back reference(向後引用):`\' 其後跟一-
茷D零十進制整數 d, 匹配與第 d
茯A號中的子表達式的匹配相同的內容(子表達式的編號是根據它-
怐漸狀A號而來,從左到右)。 因此(例如),`\([bc]\)\1' 匹配 `bb' 或 `cc'
但是不匹配 `bc'。
SEE ALSO見
regex(3)
POSIX 1003.2, section 2.8 (Regular Expression Notation).
BUGS
同時使用兩種 REs 是不明智的。
目前的 1003.2 規約稱,如果右括號 `)' 沒有對應的 `('
那麼視為普通字符;這茬W定是一茧宏~,將來會改正。 避免使用它。
向後引用是糟糕的設p,是高效的實現中n措麊漸Dn問題。
另外還會產生晦澀的語法 (?`a\(\(b\)*\2\)*d' 可以匹配 `abbbd' 嗎?)。
避免使用它怴C
1003.2 對於忽略大小寫的匹配的規定也不明確。 上接馴X的定義 ``one case
implies all cases'' 是當前各實現者的共識,被當作正確的語法。
詞邊界的語法醜拳o讓人難以接受。
AUTHOR@者
This page was taken from Henry Spencer's regex package.
[]
KAv <bbbush@163.com>
[]
2004.02.24
mlinuxan:
http://cmpp.linuxforum.net
1994-02-07 REGEX(7)