從零開始學正則

2021-07-28 02:46:20 字數 4456 閱讀 3364

這是一篇簡單介紹正規表示式的部落格,從零開始學正則,簡單易懂。

首先

我們編寫處理字串的程式或網頁時會用到正規表示式,它就是記錄文字規則的**。

舉個栗子,大家應該都知道萬用字元的概念,windows下查詢乙個word文件你會搜尋*.doc,那麼,*就是乙個任意的字串,和萬用字元類似。正規表示式就和這有一些相似,只不過比那種搜尋更精準,可以滿足你的需求。

入門

我們從栗子開始。

假設你在要在一篇英文文章裡搜尋hi,那麼你就可以使用正規表示式hi。它可以匹配到hi,hi,hi,hi這四種情況。但是還有些情況你不能排除,比如說him,history等,如果你要精確查詢hi的話,那麼你就要使用\bhi\b。

\b是正規表示式規定的乙個特殊**也叫元字元,代表單詞開頭或者結尾,也是單詞分界處。\b只匹配乙個位置,並不匹配單詞分隔字元。

如果你要查詢的是hi後面不遠處跟著乙個lucy,那麼你應該用\bhi\b.*\blucy\b。

這裡的.是乙個元字元,匹配除了換行符以外的任意字元。*代表了任意字元。所以\bhi\b.*\blucy\b就是先乙個單詞hi,然後任意個數任意字元(不能換行),然後lucy這個詞。

同時使用其他元字元,可以構造出更強大的表示式,又乙個栗子:

0\d\d-\d\d\d\d\d\d\d\d匹配的是以0開頭,然後是兩個數字,然後是乙個連字型大小-,最後是8個數字(這也就是中國的**號碼)。

這裡的\d是個新的元字元用來匹配一位數字。-只匹配本身。

為了避免重複,這個表示式也可以寫成0\d-\d。這裡的和就是重複兩次和八次的意思。

特殊**

我們已經知道幾個具有特殊意義的**了,其實還有更多的特殊**,\s代表任意空白符,包括空格、製表符(tab)以及換行符。\w代表字母或者數字

下面還是栗子。

\ba\w*\b匹配以字母a開頭的單詞。\b匹配單詞開始,a是字母a,\w匹配任意數量字母和數字,\b匹配單詞結束。

\d+匹配1個及以上的連續數字。+和*有一些相似,*代表著任意字元任意數量,而+則代表著重複一次或者更多。

\b\w\b匹配剛好8個字母或者數字的詞。

特殊**^以及$都匹配乙個位置。^匹配要用來查詢的字串開頭,$匹配結尾。這兩個**在驗證輸入的內容是非常有用,有**需要你輸入的qq號必須為7到10位數字時,那麼就可以使用:^\d$。

這裡的的意思是必須重複最少7次,最多12次,否則都不匹配。因為使用了^和$,所以輸入的字串就會用\d來匹配。

有一些正規表示式的處理工具還會有乙個處理多行的選項。如果選中了,那麼^和$的意義就變成了匹配行的開始處和結束處。

特殊**

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

\w匹配字母或數字

\s匹配任意的空白符

\d匹配數字

\b匹配單詞的開始或結束

^匹配字串的開始

$匹配字串的結束

字元轉義

有些**比較特殊,比如你要查詢.或者*,那麼要怎麼辦,所以就用到了轉義。這是\就是用來取消這些字元的特殊意義,所以當你要查詢的時候則應該用\.和\*,如果你要查詢的就是\這個符號,那麼你就要用\\。

炒個栗子

mr\.d匹配mr.d;c:\\windows匹配c:\windows;2\^8匹配2^8(通常這是書寫2的8次方的書寫方式)。

重複前面已經說過了重複,*,+,,,這幾個都代表重複。

然後舉幾個例子來說明一下

windows\d+匹配windows後面跟著1個或者跟多的數字

13\d匹配以13後面跟9個數字(手機號)

^\w+匹配一行的第乙個單詞

常用量詞

**/語法說明*

重複零次或更多次

+重複一次或更多次

?重複零次或一次

重複n次

重複n次或更多次

重複n到m次

字元類要查詢數字、字母或者空白,這些也是很簡單的,因為已經有了對應這些字符集的特殊**。

例如如果你想查詢母音(a,e,i,o,u),那麼你可以這樣說[aeiou],這就可以匹配任何乙個母音字母,[,.!?]這就可以匹配這四個字元。當我們在中括號中這樣輸入時不會被匹配成其他的意義。

同理,[0-9]的意義與\d的含義是一樣的,[a-z0-9a-z]與\w也是一樣的。

列乙個相對比較複雜的表示式:\(?0)d[) -]?\d。

這個表示式匹配的是幾種格式的**號碼(010)88888888或者023-88888888或02088888888等。分析:首先乙個轉義字元\(,?是0次或者1次,然後是乙個0,接著是出現兩個數字,後面是)或-或空格其中的乙個,?是出現1次或者不出現,最後八個數字\d。但是這個式子也是可以匹配020)88888888或者(02088888888這樣不正確的格式。所以要解決這樣的問題就要看下面的內容。

反義又是需要查詢不屬於某個簡單定義的字元型別的字元。比如想查詢除了數字以外,其他任意字元都行的情況,只是需要用到反義。

常用的反義**

**/語法

說明\d

匹配任意非數字的字元

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

[^aeiou]

匹配除了aeiou這幾個字母以外的任意字元

\w匹配任意不是字母和數字的字元

\s匹配任意不是空白符的字元

[^x]

匹配除了x以外的任意字元

栗子:\s+匹配不包含空白符的字串。

]+>匹配用尖括號括起來的以a開頭的字串

替換正規表示式裡的替換值得是有幾種規則,如果滿足其中一種規則都應該當成匹配,具體方法是用|把不同的規則分開。下面用栗子來進行說明。

(\d\.)\d是乙個簡單的ip位址匹配表示式。分析:\d代表1到3的數字,(\d\.)代表三位數加上乙個英文句號(次整體)重複三次,最後再加上乙個三位數\d。

後向引用

使用小括號制定乙個子表示式後,匹配這個表示式的文字可以在正規表示式或其他程式中作進一步的處理。預設情況下魅族會自動擁有乙個組號,規則是:以分組的左括號為標誌,從左向右,第乙個分組的組號為1,第二個為2,以此類推。

後向引用用來重複搜尋前面某個分組匹配的文字。

\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,像go go,fire fire。首先是乙個單詞\b(\w+)\b,然後是乙個或者幾個空白符\s+,最後是前面匹配的那個單詞\1。

你也可以自己指定子表示式的組號或組名。要指定乙個子表示式的組名,請使用這樣的語法:(?\w+),這樣就把\w+的組名指定為word了。要反向引用這個分組捕獲的內容,你可以使用\k,所以上乙個例子也可以寫成這樣:\b(?\w+)\b\s*\k\b。

捕獲(exp)

匹配exp,並捕獲文字到自動命名的組裡

(?exp)

匹配exp,並捕獲文字到名稱為name的組裡

(?:exp)

匹配exp,不捕獲匹配的文字

位置指定

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp後面的位置

(?!exp)

匹配後面跟的不是exp的位置

(?匹配前面不是exp的位置

注釋(?#comment)

這種型別的組不對正規表示式的處理產生任何影響,只是為了提供讓人閱讀注釋

一些沒有介紹到的表示式

\a報警字元(列印它的效果是電腦嘀一聲)

\b通常是單詞分界位置,但如果在字元類裡使用代表退格

\t製表符,tab

\r回車

\v豎向製表符

\f換頁符

\n換行符

\eescape

\0nn

ascii**中八進位制**為nn的字元

\xnn

ascii**中十六進製制**為nn的字元

\unnnn

unicode**中十六進製制**為nnnn的字元

\cnascii控制字元。比如\cc代表ctrl+c

\a字串開頭(類似^,但不受處理多行選項的影響)

\z字串結尾或行尾(不受處理多行選項的影響)

\z字串結尾(類似$,但不受處理多行選項的影響)

\g當前搜尋的開頭

\punicode中命名為name的字元類,例如\p

(?>exp)

貪婪子表示式

(?-exp)

平衡組(?-exp)

平衡組(?im-nsx:exp)

在子表示式exp中改變處理選項

(?im-nsx)

為表示式後面的部分改變處理選項

(?(exp)yes|no)

把exp當作零寬正向先行斷言,如果在這個位置能匹配,使用yes作為此組的表示式;否則使用no

(?(exp)yes)

同上,只是使用空表示式作為no

(?(name)yes|no)

如果命名為name的組捕獲到了內容,使用yes作為表示式;否使用no

(?(name)yes)

同上,只是使用空表示式作為no

零開始學python 從零開始學Python

第1章 python入門 1 1 1 什麼是python 1 1 2 python語言有什麼特點 2 1 3 python可以幹什麼 4 練一練 5 第2章 準備開發環境 6 2 1 在windows上安裝python開發環境 6 2 2 選擇和安裝開發工具 11 練一練 17 第3章 基本概念 1...

從零開始學android

相對布局管理器指的是參考某一其他控制項進行擺放,可以通過控制,將元件擺放在乙個指定參考元件的上 下 左 右等位置,這些可以直接通過各個元件提供的屬性完成。下面介紹一下各個方法的基本使用 no.屬性名稱 對應的規則常量 描述1 android layout below relativelayout.b...

從零開始學 樹

在之前做二級的題的時候,偶爾會碰見二叉樹,很自然的就想起了樹,那麼什麼是樹呢?這裡說的可不是外面的參天大樹,而是有實際概念的樹,下面就來介紹一下樹。樹是由n n 0 個結點組成的有限集合。若n 0,稱為空樹 若n 0,則 1 有乙個特定的稱為根 root 的結點。它只有直接後繼,但沒有直接前驅 2 ...