正則學習筆記

2021-06-18 03:39:54 字數 3935 閱讀 4293

最近做東西頻繁的用到正則這一塊,所以自己又翻了翻以前的筆記和檢視了正則三十分鐘入門教程。重新整理了筆記,希望在以後的學習過程中便於查閱~~(注:以下例子非本人原創)

什麼是正規表示式:在編寫處理字串的程式或網頁時,經常會有查詢符合某些複雜規則的字串的需要。正規表示式就是用於描述這些規則的工具。換句話說,正規表示式就是記錄文字規則的**。正規表示式是用於進行文字匹配的工具,即是在字串裡搜尋/查詢,即給定的字串中,尋找與給定的正規表示式相匹配的部分。有可能字串裡面不止乙個部分滿足給定的正規表示式,這時每乙個這樣的部分被稱為乙個匹配。形容詞性:乙個字串匹配乙個表示式;動詞性質:字串裡匹配正規表示式;名詞性質:字串中滿足給定的正規表示式的一部分。

正規表示式的入門(常用的元字元):

\b代表單詞的開頭和結尾,即單詞的分界處;(有的人在正規表示式裡面叫它做元字元例如:

\bhi\b.*\blucy\b)

\d匹配任意的數字(一位);

\s匹配任意的空白符,包括空格,製表符(

tab)

,換行符,中文全形空格等;

\w匹配字母或數字或下劃線或漢字等;

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

-不是元字元,只匹配本身——連字元。

例如:0\d\d-\d\d\d\d\d\d\d\d(或者

0\d-\d

)匹配這樣的字串:以

0開頭,然後是兩個數字,然後是乙個連字型大小「

-」,最後是

8個數字(匹配區號為三位的中國**號碼)

^匹配你要查詢的字串的開始;

$匹配字串的結束;(比如要求你填寫的

qq號碼必須是5到

12位:^\d$;

數如果不使用^和

$的話,對於

\d而言,使用這樣的方法就只能保證字串裡包含5到

12連續位數字,而不是整個字串就是5到

12位數字。)

例子:\(?0\d[) -]?\d。

這個表示式可以匹配幾種格式的**號碼,像(010)88886666

,或022-22334455

,或02912345678

等。我們對它進行一些分析吧:首先是乙個轉義字元

\,(,它能出現0次或

1次(?),

然後是乙個

0,後面跟著

2個數字

(\d)

,然後是)或

-或空格中的乙個,它出現

1次或不出現

(?),最後是

8個數字

(\d)。

字元轉義

如果要查詢元字元本身的話,如_.或者

_*就出現問題,我們沒有辦法直接指定塔,因為他會被解釋成別的意思,這時就是用

\來取消這些字元的特殊意義,如:

deerchao\.net

匹配deerchao.net. c:\\windows

匹配c:\windows

重複*重複零次或更多次

+重複一次或更多次(數字)

?重複零次或一次

重複n次

重複n次或更多次

重複n到

m次例如:windows\d+

匹配windows

後面跟乙個或者更多的數字

字元類

查詢數字、字母、空白都是很簡單的,因為已經有了對應這些字元的集合的元字元,但是想要匹配沒有預定義的元字元的字符集,你只需要在方括號列出如[a,e,i,o,u],[.?!]

匹配標點符號(.或

?或!)

例如:\(?0\d[)-]?\d)

分枝條件:正則裡面的分枝條件是的是有幾種規則,如果滿足其中任意一種規則都應該當成成立,忌用|

把不通過的規則分割開來。例如:

0\d-\d|0\d-\d

這個表示式匹配兩種以連字型大小分隔的**號碼:單位區號八位本地號如(

010-12345678),

一種4位區號七位本地號(

0943-2233445)

分組:即重複多個字元,用小括號來指定子表示式,例如(\d\.\d)

反義:有時需要查詢不屬於某個能簡單定義的字元類的字元,如:想查詢除了數字以外,其它任意字元都行的情況這時就用到反義

\w匹配任意不是字母,數字,下劃線,漢字的字元;

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

\d匹配任意非數字的字元;

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

[^x]匹配除了

x以外的任意字元;

[^aeiou]匹配除了

aeiou

這幾個字母以外的任意字元;

後向引用:用小括號指定乙個表示式,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其它程式中做進一步的處理,規則從左向右,以分組左括號為標誌。例如:

\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,像go go, 或者kitty kitty。這個表示式首先是乙個單詞,也就是單詞開始處和結束處之間的多於乙個的字母或數字(\b(\w+)\b),這個單詞會**獲到編號為1的分組中,然後是1個或幾個空白符(\s+),最後是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1)。

零度斷言:

(?=exp)叫做零寬度正**先行斷言,它斷言自身出現的位置的後面螚匹配表示式exp,如:\b\w+(?=ing\b)匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查詢:imsinging while you are danceing時,它只匹配sing和dance.

(?<=exp)叫做零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配的表示式exp。如:(?<=\bre)\w+\b會匹配以re開頭的單詞的後半布恩(除了re部分),如查詢reading a book ,匹配ading.

負向零寬度斷言

我們只是想要確保某個字元沒有出現,但並不想去匹配它是,如我們想要查詢這樣的單詞——它裡面出現了字母p,但是p後面跟的不是u,如:\b\w*q[^u]\w*\b

零寬度負**先行斷言(?!exp),斷言此位置的後面不能匹配表示式exp.例如:\d(?!\d)匹配三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字串abc的單詞。

零寬度負回顧後發斷言:\d(?!\d)匹配這三位數字,而且這三位數字的後面不能是數字;(?

郵箱驗證分析如下:

/^([a-za-z0-9_-])+@([a-za-z0-9_-])+(.[a-za-z0-9_-])+$/;

開始必須是乙個或多個單詞或數字或

-,然後加上

@,然後又是乙個或者多個單詞字元或者是

-,然後是

.和單詞字元和

-的組合,可以有乙個或多個組合。

js1=/^\d$/  匹配5位到

12位的

qq號碼

js2=/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/;

首先()是乙個計算單元,|表示或者,^表示開始,\表示轉義,*表示0或者多個,.是任意的字元,整個句子的意思(字元@,然後中間0個或者多個字元),或者匹配兩個點,或者匹配乙個@乙個點,或者是乙個點乙個@,或者以.開頭。

js3=/^.+\@(\[?)[a-za-z0-9\-\.]+\.([a-za-z]|[0-9])(\]?)$/;

+表示乙個或者是多個,?表示0個或者是1個,是字元組,期內-表示範圍,,$結尾。整個句子的意思:

乙個或者是多個字元開始然後是字元@然後是0或乙個[,然後是1個或者多個字母(大寫小)數字歌字元.然後是.,然後是2到3個字母(大小寫)或者1到3個數字,最後字元]結尾。

正則表達

郵箱不能以 - _ .以及其它特殊字元開頭和結束

郵箱網域名稱結尾為2~5個字母,比如cn、com、name

正則學習筆記

文星家 即 01次 0多次 1多次 匹配起始端 匹配結尾處 匹配任意單個字元,但換行符除外 x 匹配x並記住x,前提是匹配 x 匹配x但不記住x x y 匹配x,僅當後面緊跟著y時。如果符合匹配,則只有x會被記住,y不會被記住。x y 匹配x,僅當後面不緊跟著y時。如果符合匹配,則只有x會被記住,y...

正則學習筆記

字元匹配 區間範圍框 列舉值 a z0 9a z 分枝條件或 特殊轉義符 取消轉義 w a za z0 9 r n 換行符匹配 u4e00 u9fa5 漢字 s s 任意字元 懶惰匹配 若發現匹配立即返回,懶惰搜尋 例 a.b exec abcdedfb abcdedfb a.b exec abcd...

正則學習筆記2

問題 我原來寫的標籤中沒有加上,現在我想在寫好的頁面中用正規表示式對它們進行替換。舉例如下 其中的 為轉變標誌 1.2.test test 3.test test1 test2 test3 test4 test test1 test2 test3 test4 var str test test1 t...