程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 正則表達式,正則

正則表達式,正則

編輯:C#入門知識

正則表達式,正則


(轉)

大家好:

 

正則表達式是一個比較古老的技術了,現在應用卻越來越廣泛,尤其在 Web 前端的開發中,處理的對象主要是字符串格式,在前端庫中,你可以看到各種正則表達式,如果不認識的話,還是比較痛苦的。特別是現在的高級編輯器,都提供了使用正則表達式的搜索功能,會寫正則表達式,會讓你的生活更美好。

 

傳說正則表達式是一個從研究神經病學轉過來的程序員研發的技術,我感覺很像中國傳統道士畫出的驅鬼符,看不懂的時候,特別神秘,懂了的話,就會符到妖除。

這一次,我們先看正則表達式的兩個基本概念。

 

首先,正則表達式是關於文本的技術,可以幫助我們在文本中搜索特定的內容。

比如,在 Visual Studio 的文本編輯器中,就可以直接使用正則表達式進行高級搜索。下面的練習,你可以直接在 Visual Studio 的文本編輯器中完成。

 

第二部分

 

第一個概念  元字符

 

在搜索文本的時候,我們必須先描述一下搜索的目標,比如記事本就支持將搜索的內容完全寫出來,比如搜索 hello 這個詞,在正則表達式中,每個搜索的目標是使用多個元字符來表示的,比如,在 ‘hello’ 這個詞中,就有 5 個字面的元字符。這些字符直接表示我們搜索的目標,是直接寫出來的,我們一般稱為字面量。

 

能夠逐個字符直接描述出我們的搜索目標當然好了,但是,很多時候,我們很難直接寫出來,比如只記得 hello 的前兩個字母了,我們要找這個詞怎麼辦?

可以使用通配符來描述,每個通配符可以表示一個字符,在正則表達式中,英文的圓點 (.) 表示任意一個除了換行符之外的字符,如果我們知道這個單詞共有 5 個字符,就可以寫成 he… 了。如果要表示的字符就是圓點怎麼辦呢?在正則表達式中,需要使用反斜槓進行轉義,所有,寫出來就是  \. 了,因此,正則表達式應該是 he\.\.\. 。

 

圓點 (.) 可以匹配除了換行的任意字符,那麼,he*** 也可以被匹配,而我們的目標必須是字符,還可以使用更為特殊的元字符來嚴格限制一下,\w 可以匹配任何一個字母、數字或者下劃線。所以,我們可以寫成 he\w\w\w, 注意,一個元字符只能匹配一個字符,所以要寫三遍。這樣 he*** 就不會過來搗亂了。

 

常用的元字符有 7 個

.

匹配除換行符以外的任意字符

\w

匹配字母或數字或下劃線或漢字

\s

匹配任意的空白符

\d

匹配數字

\W

匹配任意不是字母,數字,下劃線,漢字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非數字的字符

 

看到了,元字符改變大小寫,意義正好相反,小寫字符表示范圍,大寫表示不在范圍,很好記。

 

自定義字符范圍

 

但是 he123 還是可以被匹配的,能不能再進一步限制到英文字母呢?當然可以,只不過沒有預定義好的元字符了,需要我們自己來描述一下可選的范圍。

使用 [] 可以明確指出我們備選的字符,列在中括號中的字符就是備選字符,比如,限制為英文小寫字符,可以把小寫字符全列出來,[abcdefghijklmnopqrstuvwxyz],這個表達式就可以表示從 a 到 z 之間的任何一個字符,不會出現數字了。

那麼,我們的正則表達式可以寫成  he[abcdefghijklmnopqrstuvwxyz] [abcdefghijklmnopqrstuvwxyz] [abcdefghijklmnopqrstuvwxyz],你是不是已經暈掉了,我還不夠麻煩的。

為了減輕你的負擔,在 [] 中允許使用連字符來設置范圍,比如 [a-z] 就可以表示剛才的從 a 到 z 的所有小寫英文字符了。從 0 到 9 的數字就可以寫成 [0-9] 了。注意,寫成 [9-0] 可不行,有方向的。

這樣,我們可以使用正則表達式  he[a-z][a-z][a-z] 來搜索 he 開頭的 5 個字符組成的目標。感覺好一點了吧。

 

邊界字符

 

要是遇到了 heabcdefg 會發生什麼呢?我們還是會匹配上其中的 heabc 的,但這並不是一個 5 個字符組成的單詞,所以,我們還需要表示一下,在我們的 5 個元字符之後,不能是其他的普通字符了,應該是類似空格、制表、換行之類的分隔符,或者,進一步說,是遇到了空格、制表、回車之類的符號就完成,但是,我們不需要匹配這個空格、制表、回車符號。

在正則表達式中,我們稱之為邊界,邊界是一個特殊的位置,比如開頭,結尾的位置,或者單詞開始結束的位置,位置並不是普通意義上的字符。所以,肯定需要用特殊的方式來表示一下了。

 

常用的位置有 4 個。

\b

匹配單詞的開始或結束

^

匹配字符串的開始

$

匹配字符串的結束

\B

匹配不是單詞開頭或結束的位置

 

\b 就表示單詞的邊界,比如說逗號 (,) 句號 (.) 空格等等,我們可以重新寫成 \bhe[a-z][a-z][a-z]\b,這樣就表示一個 5 個字符組成,開頭為 he 的單詞了。

 

第二個概念,也是這次的最後一個,數量詞

 

現在,我們的表達式\bhe[a-z][a-z][a-z]\b 還是比較繁瑣,應該簡化什麼呢?當然是寫了三遍的 [a-z] 了,這個單詞只有 5 個字符,聽說過 i18n 問題嗎?國際化的英文單詞長度是 18 個字符,連老外都直接寫成 i18n 了,要是也寫成我們這樣的正則,還不累死。數量詞就是解決這個問題的。

 

如果你嫌重復寫多編麻煩,可以使用 * ,它表示把緊接著它前面的元字符重復多遍,這個 n 可以從 0 直到 n,如果我們的正則寫成 \bhe[a-z]*\b,它就表示 一個至少有兩個字符,以 he 開頭的單詞了,你看,最少的情況下,可以匹配 he 這個詞,healthy 也可以匹配。

 

如果不想匹配 he 這個詞,希望 [a-z] 至少匹配一個字符,可以使用加號 (+),與星號 (*) 的區別是,這個 n 是從 1 到 n 的。

如果只希望匹配 0 次或者 1 次,可以使用問號 (?),這個 n 從 0 到 1。

 

慢著,說了半天,都不是我們要的,我需要的是重復 3 遍,必須是 3 遍,不能多,也不能少,那你可以使用 {n} ,這個 n 你可以直接設置,現在可以寫成 \bhe[a-z]{3}\b了。是不是很爽了。

還可以指定至少幾次,或者重復 n 到 m 次。

 

常用的數量詞

代碼/語法

說明

*

重復零次或更多次

+

重復一次或更多次

?

重復零次或一次

{n}

重復n次

{n,}

重復n次或更多次

{n,m}

重復n到m次

 

 

總結一下

這裡介紹了正則表達式的用途,基本的元字符和數量詞用法。

不過這都是非常基本的用法,以後我們慢慢介紹高級用法,如果你著急的話,可以先看一篇文章《正則表達式 30 分鐘入門教程》。

 

對於開發人員來說,還可以安裝 RegexBuddy 這個工具,裡面集成了學習,創建,測試正則表達式的各種功能,程序員的神器呀。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved