正則表達式(一)

前言

正則表達式在編碼中會常常使用到,可是平時只是須要的時候就去看看。每每看到那些元字符、量詞就直接跳過,直接百度了,一直沒有很深刻的去了解,如今有時間就簡單總結一下。javascript

基本概念

正則表達式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱爲「元字符」)。模式描述在搜索文本時要匹配的一個或多個字符串。java

正則使用場景:正則表達式

1. 檢查文本中是否含有指定的特徵詞
2. 找出文中匹配特徵詞的位置
3. 從文本中提取信息,好比:字符串的子串
4. 修改文本

元字符

元字符是在正則表達式中你有特殊含義的非字母字符。元字符必須轉義數組

( ) [ ] { } ^ $ | ? * + .函數

修飾符

  1. g: global,全文搜索,若是不添加,搜索到第一個匹配就中止。
  2. i: ignore case,忽略大小寫,默認大小寫敏感。
  3. m: mutiple lines,多行搜索

字符類匹配

字符 匹配
[...] 匹配方括號內的任意字符 例如[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對象方法

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. 當xxx只有一位的時候 取值的範圍是[1-9] 能夠表示爲[1-9]
  2. 當xxx爲兩位時 取值範圍爲[0-99] 能夠表示爲 [1-9]\d
  3. 當xxx爲三位數時最高位取值爲1 取值範圍爲[100 - 199] 能夠表示爲[1]\d{2}
    最高位取值爲2 第二位不超過5時 取值範圍爲[200 - 249] 能夠表示爲2[0-4]\d
    最高位取值爲2,十位取值5,個位取值0-5 取值範圍爲 [250 - 255] 表示爲 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

第一部分簡單回顧了正則表達式的基礎知識,下一部分重點介紹正則的分組語法 和 經常使用方法

相關文章
相關標籤/搜索