首先正則表達式是什麼? 正則表達式是一個自定義規則的表達式,用來匹配符合定義的規則的字元串。什麼意思?比如這是一個正則表達式:/\d/,\d的意思就是任意一個數字,所以這個正則表達式的意思就是匹配一個任意數字。大概明白了吧! ...
首先正則表達式是什麼?
正則表達式是一個自定義規則的表達式,用來匹配符合定義的規則的字元串。什麼意思?比如這是一個正則表達式:/\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()方法接收的參數可以是字元串,也可以是正則表達式。從例子可以看到,參數傳什麼,就在字元串中去掉什麼,然後分割成數組。
正則表達式在字元串處理中用的非常頻繁,希望大家都能學會併在開發中自如運用,今天就講到這裡,歡迎交流,歡迎指正!
原創文章,轉載請註明出處!