1. 程式人生 > >Mr.J--正則表示式

Mr.J--正則表示式

在講正則表示式之前,先給大家科普一下它的起源:

在1951 年,一位名叫Stephen Kleene的數學科學家,他在Warren McCulloch和Walter Pitts早期工作的基礎之上,發表了一篇題目是《神經網事件的表示法》的論文,利用稱之為正則集合的數學符號來描述此模型,引入了正則表示式的概念。正則表示式被作為用來描述其稱之為“正則集的代數”的一種表示式,因而採用了“正則表示式”這個術語。

之後一段時間,人們發現可以將這一工作成果應用於其他方面。Ken Thompson就把這一成果應用於計算搜尋演算法的一些早期研究,Ken Thompson是 Unix的主要發明人,也就是大名鼎鼎的Unix之父。Unix之父將此

符號系統引入編輯器QED,然後是Unix上的編輯器ed,並最終引入grep。

(Unix之父:Ken Thompson)

在最近的六十年中,正則表示式逐漸從模糊而深奧的數學概念,發展成為在計算機各類工具和軟體包應用中的主要功能。不僅僅眾多UNIX工具支援正則表示式,近二十年來,在WINDOWS的陣營下,正則表示式的思想和應用在大部分 Windows 開發者工具包中得到支援和嵌入應用!從正則式在Microsoft Visual Basic 6 或 Microsoft VBScript到.NET Framework中的探索和發展,WINDOWS系列產品對正則表示式的支援發展到無與倫比的高度,幾乎所有 Microsoft 開發者和所有.NET語言都可以使用正則表示式。如果你是一位接觸計算機語言的工作者,那麼你會在主流作業系統(*nix[Linux, Unix等]、Windows、HP、BeOS等)、主流的開發語言(delphi、

ScalaPHPC#、Java、C++、Objective-c、Swift、VB、JavascriptRuby以及Python等)、數以億萬計的各種應用軟體中,都可以看到正則表示式優美的舞姿。


 

正則表示式,又稱規則表示式(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。

目的

1. 給定的字串是否符合正則表示式的過濾邏輯(稱作“匹配”):給定一個正則表示式和另一個字串,我們可以達到如下的目的:

2. 可以通過正則表示式,從字串中獲取我們想要的特定部分。

特點

正則表示式的特點是:

1. 靈活性、邏輯性和功能性非常強;

2. 可以迅速地用極簡單的方式達到字串的複雜控制。

3. 對於剛接觸的人來說,比較晦澀難懂。

 

正則表示式常見符號
\cx 匹配由x指明的控制字元。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字元。
\f 匹配一個換頁符。等價於 \x0c 和 \cL。
\n 匹配一個換行符。等價於 \x0a 和 \cJ。
\r 匹配一個回車符。等價於 \x0d 和 \cM。
\t 匹配一個製表符。等價於 \x09 和 \cI。
\v 匹配一個垂直製表符。等價於 \x0b 和 \cK。
$ 匹配輸入字串的結尾位置。如果設定了 RegExp 物件的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字元本身,請使用 \$。
( ) 標記一個子表示式的開始和結束位置。子表示式可以獲取供以後使用。要匹配這些字元,請使用 \( 和 \)。
. 匹配除換行符 \n 之外的任何單字元。要匹配 . ,請使用 \. 。
[ 標記一箇中括號表示式的開始。要匹配 [,請使用 \[。
? 匹配前面的子表示式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字元,請使用 \?。
\ 將下一個字元標記為或特殊字元、或原義字元、或向後引用、或八進位制轉義符。例如, 'n' 匹配字元 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
^ 匹配輸入字串的開始位置,除非在方括號表示式中使用,此時它表示不接受該字元集合。要匹配 ^ 字元本身,請使用 \^。
{ 標記限定符表示式的開始。要匹配 {,請使用 \{。
| 指明兩項之間的一個選擇,要匹配|,請使用\|。
* 匹配前面的子表示式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
+ 匹配前面的子表示式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
匹配前面的子表示式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等價於 {0,1}。
{n} n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
{n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。
\b 匹配一個字邊界,即字與空格間的位置。
\B 非字邊界匹配。
\p{P}

小寫 p 是 property 的意思,表示 Unicode 屬性,用於 Unicode 正表示式的字首。中括號內的“P”表示Unicode 字符集七個字元屬性之一:標點字元。

其他六個屬性:

L:字母;

M:標記符號(一般不會單獨出現);

Z:分隔符(比如空格、換行等);

S:符號(比如數學符號、貨幣符號等);

N:數字(比如阿拉伯數字、羅馬數字等);

C:其他字元。

*注:此語法部分語言不支援,例:javascript。

\S 匹配任何可見字元。等價於[^ \f\n\r\t\v]。
\s 匹配任何不可見字元,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。
\d 匹配一個數字字元。等價於[0-9]。grep 要加上-P,perl正則支援
\D 匹配一個非數字字元。等價於[^0-9]。grep要加上-P,perl正則支援
\num 匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續的相同字元。
\xn 匹配n,其中n為十六進位制轉義值。十六進位制轉義值必須為確定的兩個數字長。例如,“\x41”匹配“A”。“\x041”則等價於“\x04&1”。正則表示式中可以使用ASCII編碼。
\w 匹配包括下劃線的任何單詞字元。類似但不等價於“[A-Za-z0-9_]”,這裡的"單詞"字元使用Unicode字符集>。
\W 匹配任何非單詞字元。等價於“[^A-Za-z0-9_]”。
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”(此處請謹慎)。“[zf]ood”則匹配“zood”或“food”。
[xyz] 字元集合。匹配所包含的任意一個字元。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 負值字元集合。匹配未包含的任意字元。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z]

字元範圍。匹配指定範圍內的任意字元。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字元。

注意:只有連字元在字元組內部時,並且出現在兩個字元之間時,才能表示字元的範圍; 如果出字元組的開頭,則只能表示連字元本身.

[^a-z] 負值字元範圍。匹配任何不在指定範圍內的任意字元。例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字元。

 

時不時感覺看著毫無頭緒?

 

並不是所有的程式語言都實行統一標準,正則表示式語法支援情況:

為了我們能夠很好的記憶這些perl形式的程式設計符號,下面這一段文字可以很好的幫助我們理解:

?,*,+,\d,\w 都是等價字元
  ?等價於匹配長度{0,1}
  *等價於匹配長度{0,} 
  +等價於匹配長度{1,}
  \d等價於[0-9]

\D等價於[^0-9]
  \w等價於[A-Za-z_0-9]

\W等價於[^A-Za-z_0-9]。

常用運算子與表示式:
  
^ 開始
  () 域段
  [] 包含,預設是一個字元長度
  [^] 不包含,預設是一個字元長度
  {n,m} 匹配長度 
  . 任何單個字元(\. 字元點)
  | 或
  \ 轉義
  $ 結尾
  [A-Z] 26個大寫字母
  [a-z] 26個小寫字母
  [0-9] 0至9數字

[A-Za-z0-9] 26個大寫字母、26個小寫字母和0至9數字
  , 分割
  .
  
  分割語法:
  [A,H,T,W] 包含A或H或T或W字母
  [a,h,t,w] 包含a或h或t或w字母
  [0,3,6,8] 包含0或3或6或8數字

                                                     以上內容摘取自百度百科(點選檢視),菜鳥教程

正則表示式雖然不好識記,但是當你理解之後使用是非常方便的(敲程式碼的時候,寫了一長串正則表示式,分號結束之後自己也不認識自己寫的啥,啊哈哈哈哈哈)