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