2010年12月9日 星期四

正規表示 Regular Expression – RegExp (Perl 相容)

http://webdesign.kerthis.com/post/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA-regular-expression


本文介紹相容於Perl正規表示式(Regular Expression、RegEx)的符號與各種語法: 


特殊字元(字串)

.

表示除了換行字元(\n)外的任意字元。(除非在s單列模式下才 . 才可比對\n)

\w

表示任意英文字母及數值字元。

\W

表示\w所接受的字元通通不接受。

\s

表示任意空白字元,如空白鍵及tab鍵。

\S

表示接受任何非空白字元

\d

表示接受任意數字字元

\D

表示任何非數字的字元

\n

表示換行字元

\r

表示return對應的字元

\t

表示tab鍵的字元

\b

比對字的邊界

\B

非字的邊界

\v

vertical Tab

\f

from feed

\nnn

八位元碼為nnn的字元

\xnn

十六位元碼為nn的字元

\unnnn

unicode為nnnn的字元


跳脫字元

\

用來跳脫特殊字元,任何「非數值」的字元可以透過反斜線\代表直接以該字元為樣板宣告。例如\^是表示^這個字元,而非代表字組的起始字元。要跳脫反斜線本身則可用\\來表示。


匹配多個可接受的字元組

[]

例如[ace]表示匹配一個字元而這個字可能是a或c或e。此外,在中括號裡面的特殊字元其特別意義都不再存在,也就是只表示單純字面上的意義。另一方
面,中括號裡面的特殊字元有破折號-及脫字符號^。-代表某一範圍內之字元的意思,如[a-z]表示所有小寫英文字母;而^放在中括號中則表是否定的意
思,如[^a]表示非a之外的任意字元。


擇一、選替 Alternatives

|

當要匹配幾個特定的選擇時,則要使用特殊字元|,其代表擇一的意思。舉例來說,a|b表示字元為a或者為b。使用時需注意前後的次序,因為在|中的字組會優先選擇符合最左邊的項目。


群組 Group

(群組)

例如(abc){2}會匹配abcabc。


抓取、參照、記憶

(expression)

匹配符合的expression並將它抓取進自動命名的群組(命名順序由1開始至23456··)。例如(abc)表示匹配abc並將它記錄到群組1,而你就可以用backreference \1來取出這個抓取到的群組,換句話說\1就是abc。


(?<name>expression)

如果你不喜歡群組自動命名的1,也可以自己來命名,我們將上面例子改寫,(abc)改寫成(?<name>abc),如此就可以將抓取的群組命名為name了,要取出它則用\k<name>。


(?:expression)

此式表示匹配但不抓取它


標位點與零寬比對

為什麼說零寬呢?因為本身並不會對應任何文字,只用來界定位置

^

字串起點。在m多列模式下則包括任何\n字元之後的位置。如^abc為比對符合開頭為abc的字組。

\A

字串起點,無論何種比對模式下(不像^,\A皆不包括任何\n字元之後的位置)。

$

字串結尾。在m多列模式下則包括任何\n字元之前的位置。如abc$為比對符合結尾為abc的字組。

\Z

字串結尾,無論何種比對模式下(即.\Z比對abc\ndef會得f)。

\b

字詞邊界。包括介於\w與\W字元之間的位置,以及自串起點與結尾。如可用「.\b」來比對「c」於「abc」中。

\B

非字詞邊界。


標位點與零寬比對 - Lookaround

什麼是lookahead及lookbehind
assertions?它們是用來搜尋目前pattern之前或之後的字元組,但並不包含match
assertions本身。再更詳細一點,Lookaround有點像是「^」、「$」、「\b」這些特殊字元,即本身並不會對應任何文字,只用來界定位
置,故我們將它們稱做zero-width assertions,我們往下看看lookaround可以做些什麼。


Positive Lookaround

(?=expression)

符合字尾為expression的字組

例:我們可以用\w+(?=ing)來符合字尾為ing的字,但不會包含ing本身,像我們拿來匹配filling這個字得到的就會是fill。

(?<=expression)

符合字首為exp的字組

例:我們可以用(?<=g)\w+來符合字首為g的字,但不會包含g本身,像我們拿來匹配good這個字得到的就會是ood。


Negative Lookaround

(?!expression)

符合字尾沒接expression的字組

(?<!expression)

符合字首沒接expression的字組


描述次數的特殊字元 (量詞)

貪多量詞 (greedy quantifiers)

貪多是什麼意思?簡單的說,比對以「多」為原則。如(ab)+可比對出整個ababababababab。

這類量詞會盡可能的消耗受比對的字串(就是越多越好~),但當消耗過多造成後續樣式比對失敗則會逐漸放棄部分的比對結果,一直到同時滿足後續樣式為止,這個放棄的過程我們稱作「回步(backtrackin)」。


{幾次} 、 {幾次, 到幾次} 、 {幾次以上,}

舉例來說,a{3}代表連續3個a;a{1,3}表示可能是a、aa或aaa;a{1,}則表示a有一個以上。

*

表示指定的字元可以出現任意次數,即0次到無限多次。

+

表示指定的字元重覆至少一次

?

表示指定的字元重覆零次或一次


不貪多(惰性)量詞 (lazy quantifiers)

相反的,即以少(長度最短)為原則。如(ab)+?比對ababababababab結果為ab。

*?

出現0或多次,但以少為原則。

+?

出現1次或多次,但以少為原則。

+?

出現0次或1次,但以少為原則。


支配量詞 (possessive quantifiers)

這有點像貪多量詞,但差在它們不回步,講白一點就是它們就是要「多」。就算後續比對失敗也不管、不讓步。

*+

出現0或多次,不回步。

++

出現1次或多次,不回步。

?+

出現0次或1次,不回步。

{n次}+

至少出現n次,不回步。

{n次,}+

至少出現n次,不回步。

{m次,n次}+

至少出現m次但不超過n次,不回步。


(?>比對樣式) 單體組 Atomic group

不回步,整個比對出來樣文段,在回步時會被視做一個單體,不可以部分被丟棄。例如(?>[abc]+\w\w)可比對出abcabcdd,但比對abcaabbcc會造成失敗,因為abcaabbcc已經被當成「一體」的。


 

呼~最後來談一下註解還有模式飾詞吧


模式飾詞 Mode modifier (或稱flag)

modifier是用來告訴正規式引擎對於正規表示式的解釋方式。

i

不區分大小寫

m

多列模式,「^」及「$」在此模式下表示\n的相鄰字元

s

單列模式,「.」代表任何字元,包括\n

x

忽略空白字元,容許樣式中出現註解「#···」

U

反轉量詞的貪多性質,「*」變不貪多;而「*?」則變貪多

A

強制從受測字串的起點開始比對

D

強制「$」代表字串結尾,而非\n前的字元,但若有開啟多行模式m則以多行模式為主

u

將正規式與受測字串皆當作UTF-8字元處理

(?mode)

以指定模式來比對後續字串,如(?i)接下來比對不分大小寫

(?-mode)

取消模式,(?i)接下來比對不分大小寫(?-i)接下來回復分大小寫

(?mode:···)

以指定的模式來比對括弧內的樣式

(?-mode:···)

取消模式對括弧內的樣式的影響

\Q······\E  

將\Q及\E 之間的特殊字元視作一般字元

(?#···)

括弧內的字串視作註解

#······

在x模式下,#後到列尾的字串都當作是註解


繼續閱讀:

http://perldoc.perl.org/perlre.html


 


沒有留言:

張貼留言