Provided by: manpages-zh_1.5-1_all bug

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  ij  的話,就匹配   ij   茬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)