正則表達式在編碼中會常常使用到,可是平時只是須要的時候就去看看。每每看到那些元字符、量詞就直接跳過,直接百度了,一直沒有很深刻的去了解,如今有時間就簡單總結一下。javascript
正則表達式是一種文本模式,包括普通字符
(例如,a 到 z 之間的字母)和特殊字符
(稱爲「元字符」)。模式描述在搜索文本時要匹配的一個或多個字符串。java
正則使用場景:正則表達式
1. 檢查文本中是否含有指定的特徵詞 2. 找出文中匹配特徵詞的位置 3. 從文本中提取信息,好比:字符串的子串 4. 修改文本
元字符是在正則表達式中你有特殊含義的非字母字符。元字符必須轉義數組
( ) [ ] { } ^ $ | ? * + .函數
字符 | 匹配 |
---|---|
[...] | 匹配方括號內的任意字符 例如[abcd] |
[^ x ] | 匹配除了x之外的任意字符 例如 [^abcd] 匹配除了abcd之外的任意字符 |
. | 匹配除了換行符 |
\s | 匹配任意的空白符 |
\S | 匹配任意不是空白符的字符 |
\w | 匹配字母或者數字、下劃線、漢字 等價於[a-zA-Z0-9] |
\W | 匹配不是字母或者數字、下劃線、漢字 |
\d | 匹配任意數字 |
\D | 匹配任意非數字的字符 |
\b | 匹配單詞的開始或者結束的位置 |
字符 | 匹配 |
---|---|
{n,m} | 匹配前一項至少n次,但不能超過m次 |
{n,} | 匹配前一項n次或更屢次 |
{n} | 匹配前一項n次 |
? | 匹配前一項0次或者1次,也就是說前一項是可選的,等價於{0,1} |
+ | 匹配前一項1次或屢次,等價於{1,} |
* | 匹配前一項0次或屢次,等價於{0,} |
元字符/元符號 | 匹配 |
---|---|
$ | 匹配字符串的結尾,在多行檢索中,匹配一行的結尾 |
^ | 匹配字符串的開頭,在多行檢索中,匹配一行的開頭 |
A | 只有匹配字符串開始處 |
b | 匹配單詞邊界,詞在 []內時無效 |
\B | 匹配非單詞邊界 |
\G | 匹配當前搜索的開始位置 |
\Z | 匹配字符串結束處或行尾 |
\z | 只匹配字符串結束處 |
元字符/元符號 | 匹配狀況 |
---|---|
(string) | 用於反向引用的分組 |
1 或$1 | 匹配第一個分組中的內容 |
2 或$2 | 匹配第二個分組中的內容 |
3 或$3 | 匹配第三個分組中的內容 |
字符 含義 i 執行不區分大小寫的匹配 g 執行一個全局匹配,即找到全部匹配而非一次匹配 m 多行匹配模式,^匹配一行的開頭和字符串開頭,$匹配行的結束和字符串的結尾
1.字面量編碼
var pattern = /\bis\b/g;
eg:
var reg1=/hello world (\w*)/gi;
code
2.構造函數對象
var pattern = new RegExp('\\bis\\b', 'g'); new RegExp("正則表格式字符串",正則表達式修飾符); 注意⚠️: 由於構造函數中使用的是字符串,因爲字符串轉義問題,"\\"表明"\"。
RegExp對象給咱們提供了三種方法供咱們使用,分別是test()、exec()和compile()。下面具體說一下這三個方法的用處。ip
1.test()字符串
檢索字符串中指定的值。返回 true 或 false。這個是咱們平時最經常使用的方法。
var reg=/hello \w{3,12}/; alert(reg.test('hello js'));//false alert(reg.test('hello javascript'));//true
2.exec()
檢索字符串中指定的值。匹配成功返回一個數組,匹配失敗返回null。
var reg=/hello/; console.log(reg.exec('hellojs'));//['hello'] console.log(reg.exec('javascript'));//null
3.compile()
compile() 方法用於改變 RegExp。
compile() 既能夠改變檢索模式,也能夠添加或刪除第二個參數。
var reg=/hello/; console.log(reg.exec('hellojs'));//['hello'] reg.compile('Hello'); console.log(reg.exec('hellojs'));//null reg.compile('Hello','i'); console.log(reg.exec('hellojs'));//['hello']
1.匹配下面的電話號碼:
1. (010)88886666 2. 022-22334455 3. 02912345678 /\(?0\d{2}[\)-]?\d{8}/;
驗證以下
var regex = /\(?0\d{2}[\)-]?\d{8}/; regex.test(" 02912345678") regex.test(" 022-22334455") regex.test("(010)88886666") true
2.匹配ip地址
IP地址格式可表示爲:XXX.XXX.XXX.XXX,XXX取值範圍是0-255,前三段加一個.重複了三次,在與最後一段合併及組成IP地址的完整格式。
最簡單的寫法 /([0-9]{1,3}\.){3}[0-9]{1,3}/
可是這樣會匹配到不少無效的ip xxx的範圍超過255.
因此對這個寫法進行改進
[1-9]
[1-9]\d
[1]\d{2}
2[0-4]\d
25[0-5]
將這三種狀況合併能夠表示(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))
整個ip的正則能夠表示爲 ((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))
可是這還存在問題 如今只要字符串中有一部分可以經過校驗test就會返回true 例如2313.2.3.4。
var regex = /((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))/; regex.test("3424.2.3.2"); true
因此還要對正則的啓始位置進行限制
var regex = /^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$/; regex.test("3424.2.3.2"); false
第一部分簡單回顧了正則表達式的基礎知識,下一部分重點介紹正則的分組語法 和 經常使用方法