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
沒有留言:
張貼留言