JavaScript中的正則表達式

首先正則表達式是什么?
正則表達式是一個自定義規則的表達式,用來匹配符合定義的規則的字符串。什么意思?比如這是一個正則表達式:/\d/,\d的意思就是任意一個數字,所以這個正則表達式的意思就是匹配一個任意數字。大概明白了吧!
下面我們來看看正則表達式都由些什么東西組成。

一、直接量字符

| 字符 | 含義 |
|--------------|-------------|---------------|
| 字母和數字字符 | 自身 |
| \t | 匹配一個水平制表符 |
|\v|匹配一個垂直制表符|
|\n|匹配一個換行符|
|\f|匹配一個換頁符|
|\r|匹配一個回車符|

二、范圍類

|字符|含義|
|-------|----------|------------|
|-|例如a-z表示a-z的26個字母
|{n,m}|匹配前一項n到m次
|{n,}|匹配前一項n次或者更多次
|{n}|匹配前一項n次
|*|匹配前一項任意次
|+|匹配前一項至少一次
|?|匹配前一項0次或1次

什么意思?舉個栗子:/[a-z]3{1,3}5+/這個表達式,意思是,任意一個英文字母出現一次,然后出現一到三次數字3,然后數字5至少出現一次。
下面我們在chrome調試工具中用test()方法試一下:


注:test()方法用來檢驗一個字符串是否匹配某個正則表達式,接收一個參數,即目標字符串,如匹配則返回true,否則返回false

三、字符類

|字符|含義
|-----------|----------|-----------|
|[...]|匹配方括號內任意字符
|[ ^...]|匹配除方括號內字符的其他任意字符
|.|除換行符和行終止符之外的任意字符
|\w|任意單詞和下劃線,等價于[a-zA-Z0-9_]
|\W|\w的否定,等價于[^a-zA-Z0-9_]
|\s|匹配任意一個空白符
|\S|匹配任意一個非空白符
|\d|任意一個數字,等價于[0-9]
|\D|任意一個非數字,等價于[^0-9]
|[\b]|退格直接量

什么東西,寶寶看不懂啊!讓我們看個例子:/[abc]\w\d{2}/,這個表達式的意思是,匹配abc中任意一個,接下來是一個單詞([a-zA-Z0-9])或者下劃線,然后是兩個數字。看圖!


四、錨字符

字符 含義
^ 表示開頭,如^a表示以a開頭的字符串
$ 表示結尾,如b$表示字符串的結尾是b字母
\b 單詞邊界,如/\bis\b/匹配is而不匹配this
\B 非單詞邊界,如/\Bis\b/可匹配this

這里說一下^,表示以……開頭,我們看個例子:


作為對比,這里表達式中沒有^

$原理跟^一樣,這里不再贅述,只是需要注意一點,$需要寫在表達式的最后面。

五、修飾符

字符 含義
g 全局匹配,即找到所有匹配,而不是找到第一個就停止
i 不區分大小寫
m 多行匹配

在沒有g修飾符的情況下,正則表達式匹配到第一項即停止匹配,當有g修飾符時,會找到所有匹配項。我們學習一個正則表達式的新方法replace():

注:replace()方法作用是替換字符串中規定的字符,接收兩個參數,第一個參數是一個正則表達式,表示你要替換的內容,第二個參數是一個字符串,表示你要 替換成 的內容。看下面例子!


只替換了第一個數字,再看下有g修飾符的情況:



全部數字都被替換了,明白g是干嘛的了吧。

再說i,i修飾符就很簡單了,表示不區分大小寫,看下面例子:



加了i之后,不管大小寫字母都被替換了!

最后m表示多行搜索,比如要匹配以字母a開頭的字符串,在有m修飾符的情況下,換行后以a開頭的行也會被匹配。限于篇幅這里不貼圖了。

六、分組

正則表達式中用圓括號()表示分組,每個()表示一個分組。而分組中的內容用$1、$2……表示,仍然看例子:
比如日期有這兩種表示法:月-日-年和年/月/日,怎么把月-日-年換成年/月/日呢?我們看看



在這個例子中,我們給月、日和年分了組,然后再利用$反向引用,于是實現了日期格式的轉換。

七、方法

關于正則表達式的零零碎碎的東西基本講完了,下面我們開始學習在正則表達式中用到的方法!有兩類,一類是正則表達式對象方法,一類是字符串對象方法。

一、正則表達式對象方法

有兩個,test()exec()。test()方法我們學過了,現在講講exec()方法。
exec()方法返回一個數組,數組的第一個元素是匹配的文本,第二個元素是匹配文本的第一個子文本,第三個元素是匹配文本的第二個子文本……以此類推。這樣很抽象,看下面例子就懂了!
exec()的調用又分兩種情況:非全局調用全局調用

非全局調用情況:

看下圖例子



這里我們看到,第一次匹配了"a12b",后面兩個元素分別是第一個分組"1"和第二個分組"2"。可是第二次執行exec()方法,匹配的依然是"a12b",這是意料之外的。按理說第二次匹配的應該是"c56d",可是為什么還是"a12b"呢?原因就在lastIndex屬性上。lastIndex屬性表示上次匹配結果的最后一個字符的下一個字符,但是這屬性只在全局調用時(即表達式中加了g修飾符的情況)生效,非全局調用時始終為0。作為對比,我們看看全局調用情況!

全局調用情況:


可以看到,第一次執行exec()返回了"a12b",lastIndex為4,即為字符串str中數字3的位置;第二次返回了"c56d",lastIndex為10,即為字符串str中數字7的位置。這時lastIndex起作用了,所以兩次執行結果都在意料之中。

二、字符串對象方法

字符串對象方法有:search()、replace()、match()、split()。

一、search()方法

search()方法用于檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串。如果匹配到,則返回第一個匹配結果的index,沒匹配到則返回-1。接收一個參數,這個參數可以是字符串,也可以是正則表達式。這個方法每次都從字符串的開頭開始匹配。我們看下面例子:



兩次搜索數字2返回的index都是1,而不會是第二個數字2的index5。第三和第四次搜索傳入一個正則表達式,都返回了相對應的index。

二、replace()方法

這個方法前面已經學過,這里繼續。有這幾種形式:replace(str,replaceStr)、replace(RegExp,replaceStr)、replace(RegExp,function)。前面兩種比較簡單,看個例子就懂了:



第一次傳入字符串,把數字2替換成X,第二次傳入正則表達式,把全部數字替換成X。
replace(RegExp,function)方法第二個參數是一個函數,這個方法適用于比較復雜的字符替換,大家有興趣可以自己找學習資源,限于篇幅,這里不作介紹。

三、match()方法

match()方法傳入一個參數:正則表達式,用來查找字符串中與傳入的正則表達式相匹配的文本,如找不到則返回null,如果找到,返回一個數組,這個數組在非全局調用全局調用時是不一樣的,下面分開說。

非全局調用:

在非全局調用時,返回的數組是這樣的:第一個元素是匹配的文本,第二個元素是匹配文本的第一個子文本,第三個元素是匹配文本的第二個子文本……以此類推。是不是有似曾相識的感覺?沒錯,這一點和exec()方法一模一樣。



非全局調用時每次查找依然從字符串的開頭開始,下面看看全局調用!

全局調用:

在全局調用(即正則表達式中有g修飾符)時,返回的數組是這樣的:數組的每一項都是匹配的文本,不再有匹配文本的子文本了。



和正則表達式相匹配的"a12b"和"c56d"都出現在數組里了。其實match()方法和exec()方法作用都是一樣的,只不過一個由字符串調用,一個由正則表達式調用而已。

四、split()方法

split()方法用于把字符串分割成數組,什么意思呢?看下面例子:



split()方法接收的參數可以是字符串,也可以是正則表達式。從例子可以看到,參數傳什么,就在字符串中去掉什么,然后分割成數組。
正則表達式在字符串處理中用的非常頻繁,希望大家都能學會并在開發中自如運用,今天就講到這里,歡迎交流,歡迎指正!
原創文章,轉載請注明出處!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容