正則表達式,又稱規則表達式(Regular Expression,在代碼中常簡寫爲regex、regexp或re)。它是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。在大部分語言、數據庫中都支持正則表達式。正則表達式一般被用來檢索、替換那些符合某個模式(規則)的文本。正則表達式
1.驗證給定字符串是否符合指定特徵,好比驗證Email是否合法。
2.用來查找字符串,從一個長的文本中查找符合指定特徵的字符串。
3.用來替換,替換給定字符串中符合指定特徵的部分數據庫
字母、數字、漢字、下劃線、以及沒有特殊定義的標點符號,都是「普通字符」。表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符。編程
標準字符集合能夠匹配集合中全部字符數組
注:"\d"、"\w"、"\s"區分大小寫,大寫時爲取反,即匹配不在集合中的字符spa
用[ ]方括號括起來的即爲自定義字符集合,可以匹配方括號中任意一個字符。
例:[ab5@]:匹配 "a" 或 "b" 或 "5" 或 "@" 。
[^abc]:匹配 "a","b","c" 以外的任意一個字符 。
[f-k]:匹配 "f"~"k" 之間的任意一個字母 。
[^A-F0-3]:匹配 "A"~"F","0"~"3" 以外的任意一個字符。regexp
注:1.正則表達式中的特殊符號,若是被包含於中括號中,則失去特殊意義,僅表明該字符自己( \ [ ] : ^ - 除外)。
2. 標準字符集合,除小數點(.)外,若是被包含於中括號中,自定義字符集合將包含該集合。好比:[\d.\-+],將能夠匹配數字,小數點和 + - 符號。(小數點和 + 號失去特殊意義)對象
在匹配次數中分爲貪婪模式和非貪婪模式。(默認爲貪婪模式,在在修飾匹配次數的特殊符號後再加上一個 "?" 號就爲非貪婪模式)
貪婪模式(匹配字符越多越好):
「{m,n}」, 「{m,}」, 「?」, 「*」, 「+」,具體匹配的次數隨被匹配的字符串而定。這種重複匹配不定次數的表達式在匹配過程當中,老是儘量多的匹配。
非貪婪模式(匹配字符越少越好)
在修飾匹配次數的特殊符號後再加上一個 "?" 號,則可使匹配次數不定的表達式儘量少的匹配,使可匹配可不匹配的表達式,儘量的 "不匹配"。 blog
字符邊界匹配的不是字符而是位置(符合某種條件的位置)。ip
「|」左右兩邊表達式之間 存在"或" 關係,即匹配左邊或者右邊。字符串
1.在被修飾匹配次數的時候,括號中的表達式能夠做爲總體被修飾。
2.取匹配結果的時候,括號中的表達式匹配到的內容能夠被單獨獲得。
3.每一對括號會分配一個編號,使用 () 的捕獲根據左括號的順序從 1 開始自動編號。(能夠用\編號再次匹配那個分組的內容)
IGNORECASE 忽略大小寫模式
– 匹配時忽略大小寫。
– 默認狀況下,正則表達式是要區分大小寫的。
SINGLELINE 單行模式
– 整個文本看做一個字符串,只有一個開頭,一個結尾。
– 使小數點 "." 能夠匹配包含換行符(\n)在內的任意字符。
MULTILINE 多行模式
– 每行都是一個字符串,都有開頭和結尾。
– 在指定了 MULTILINE 以後,若是須要僅匹配字符串開始和結束位置,可使用 \A 和 \Z
匹配聯繫方式
(0\d{2,3}-[1-9]\d{6,7})|(1[35678]\d{9})
匹配手機號碼
^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$
匹配正常的QQ號碼
[1-9][0-9]{4,11}
匹配貴族QQ號碼
abcxxabc
(\d{3})\d{2}\1
xxxxabab
\d{4}(\d{2})\1
xxxxabcdxxxxdcba
(\d{3,5})(\d)(\d)(\d)(\d)\1\5\4\3\2
匹配郵箱
\w{6,18}@\w{2,10}(\.\w{2,3}){1,3}
匹配18-60
(1[89])|([2-5]\d)|(60)
匹配身份證18位
^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
匹配漢字
[\u4e00-\u9fa5]
匹配日期
\d{4}-(((0?[13578]|1[02])-(0?[1-9]|[12][0-9]|3[01]))|((0?[469]|11)-(0?[1-9]|[12][0-9]|30))|(0?2-(0?[1-9]|[12][0-9])))
\d{4}-(((0[1-9]|1[0-2])-(0[1-9]|[12]\d))|((0[13-9]|1[0-2])-30)|((0[13578]|1[02])-31))
29
(0[1-9]|1[0-2])-(0[1-9]|[12]\d)
30
(0[13-9]|1[0-2])-30
31
(0[13578]|1[02])-31
匹配IP
^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])(\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)){3}$
正則表達式的編譯表示形式。
Pattern p = Pattern.compile(r,int); //創建正則表達式,並啓用相應模式
經過解釋 Pattern 對字符串執行匹配操做的引擎
Matcher m = p.matcher(str); //匹配str字符串
matches() find() reset() group()
驗證表達式是否匹配整個字符串
驗證表達式是否能夠匹配字符串的子字符串
返回給定字符串中匹配給定正則表達式全部子字符串
替換給定字符串中匹配正則表達式的子字符串
根據正則表達式定義規則截取字符串
re = /pattern/[「flags」] var re1 = /\d{3}/ig;
re = new RegExp("pattern",["flags"]) var re2 = new RegExp("\\d{3}","ig");
Flags可選項常見值:
g (全文查找出現的全部pattern)
i (忽略大小寫)
exec(): 返回的是一個數組。該數組包含了匹配該模式的第一個子字符串以及該子字符串中匹配相關分組的字符串。好比:
var re = new RegExp("(\\d+)([a-z]+)","ig");
var result = re.exec("33ff55tt77uu88yy");
返回的數組爲:[33ff,33,ff]
test(): 返回一個 Boolean 值,它指出在被查找的字符串中是否存在模式匹配的子字符串
match():使用正則表達式模式對字符串執行查找,並將符合該模式的全部子字符串包含到數組中返回。 var re = new RegExp("(\\d+)([a-z]+)","ig "); var t = "33ff55tt77uu88yy".match(re); 結果爲數組:[33ff,55tt,77uu,88yy] search(): 返回與正則表達式查找內容匹配的第一個子字符串的位置 split(regex):按照指定的模式切割字符串,返回一個數組。 var t = "asdfd33ff55tt77uu88yy".split(/\d+/); replace(): var t = "asdfd33ff55tt77uu88yy".replace(/\d+/g ,"**"); 注意:這種用法,正則表達式對象的模式必須爲global模式。不然只替換第一個子字符串