搬運自我的博客,原址正則表達式-理論基礎篇javascript
什麼是正則表達式?
能夠稱做規則一個描述字符模式的對象,正則表達式中的字母和數字,都是按照字面含義進行匹配的。強大的字符串匹配工具java
如何創建一個正則表達式?git
使用RegExp()構造函數來建立RegExp對象github
特殊的直接量語法來建立,定義爲包含在一對斜槓(/)之間的字符正則表達式
例:var reg = /s$/;
, var reg = new RegExp(s$);
二者效果徹底相同,用來匹配全部以字母「s」結尾的字符串。數組
非字母的字符匹配,這些字符須要經過反斜線(\)做前綴進行轉義.函數
字 符 | 匹 配 |
---|---|
字母和數字字符 | 自身 |
\o |
NUL字符 |
\t |
製表符 |
\n |
換行符 |
\v |
垂直製表符 |
\f |
換頁符 |
\r |
回車符 |
\xnn |
由十六進制數nn指定的拉丁字符,例:\x0A 等價於\n |
\uxxxx |
由十六進制數xxxx指定的unicode字符,例:\u0009 等價於\t |
\cX |
控制字符^X,例:\cJ 等價於換行符\n |
具備特殊含義的標點符號:工具
^
, $
, .
, *
, +
, ?
, =
, !
, :
, |
, \
, /
,(
,)
,[
,]
,{
, }
post
想在正則表達式中使用這些字符的直接量進行匹配,則必須使用前綴"\",其餘標點符號(好比@和引號)無特殊含義,在正則表達式中按照字面含義進行匹配。編碼
方括號,或,範圍
將直接量字符單獨放進方括號內就組成了字符類。一個字符類能夠匹配它包含的任意字符。字符類可使用連字符來表示字符範圍。
字 符 | 含 義 |
---|---|
[...] |
方括號內的任意字符 |
[^...] |
不在方括號內的任意字符 |
. |
除換行符合其餘unicode行終止符以外的任意字符 |
\w |
任何ASCII符組成的的單詞,等同[a-zA-Z0-9] |
\W |
任何不是ASCII符組成的的單詞,等同[^a-zA-Z0-9] |
\s |
任何unicode空白字符 |
\S |
任何非unicode空白符的字符,注意\W 與\s 不一樣 |
\d |
任何ASCII數字等價於[0-9] |
\D |
除了ASCII數字以外的任何字符,等價於[^0-9] |
[\b] |
退格直接量(特例) |
例:
/[a,b,c]/
:表示和字母"a","b","c"中的任意一個都匹配
/[a-z]/
:匹配拉丁字母表中的小寫字母
/[/s/d]/
:匹配任意空白符或數字
用以指定字符重複的標記
字 符 | 含 義 |
---|---|
{n,m} |
匹配前一項至少n次,但不能超過m次 |
{n,} |
匹配前一項n次或者更屢次 |
{n} |
匹配前一項n次 |
? |
匹配前一項0次或者1次(也就是前一項是可選的,等價於{0,1}) |
+ |
匹配前一項1次或者屢次(等價於{1,}) |
* |
匹配前一項0次或者屢次,等價於{0,} |
例:
/\d{2,4}/
:匹配2-4個數字。
/\w{3}\d?/
:精確匹配三個單詞和一個可選的數字。
/\s+java\s+/
:匹配先後有1個或多個空格的字符串"java"
/[^(]*/
:匹配0個或多個非左括號的字符(這裏實際上能與"("
匹配)
在使用"*"
,和"?"
時要注意,因爲這些字符能匹配0個字符,所以它們容許什麼都不匹配,例:
/a*/
能匹配字符串"bbbb",因其含有0個a。
上表中列出的匹配字符爲"貪婪的"匹配,它老是儘量多地匹配,且容許後續的正則表達式繼續匹配。
非貪婪匹配,只需在待匹配的字符後跟隨一個問號便可,"?"
,+?
,*?
或{1,5}?
。例:
/a+/
:匹配"aaa"時,三個字符都被匹配,
/a+?/
:匹配"aaa"時,因其儘量少的匹配,只能匹配第一個a
包括:指定選擇項,自表達式分組,和引用前一子表達式的特殊字符
選擇項的嘗試匹配次序是從左到右,直到發現匹配項,若左邊成功匹配就忽略右邊的項。
正則表達式中圓括號的做用:
把單獨的項組成子表達式,以便於能夠像處理獨立單元同樣,用\|
,*
,+
或者?
等等來對單元內的項進行處理
在完整的模式中定義子模式
容許在同一正則表達式的後部,引用前面的子表達式
字 符 | 含 義 |
---|---|
"|" | "|"選擇,匹配的是該符號左邊的子表達式或右邊的子表達式 |
(...) |
組合,將幾個項組合成爲一個單元,這個單元可經過"|",* ,+ 或者? 等符號,加以修飾,並且能夠記住和這個相匹配的字符串以供之後的引用使用 |
(?:..) |
只組合,把項組合到一個單元,但不記憶與該組相匹配的字符 |
\n |
和第n個分組第一次匹配的字符相匹配,組是圓括號中的子表達式(也有可能嵌套的),組索引是從左到右的左括號數,"(?:形式的分組不編碼" |
例:
/ab|cd|ef/
:能夠匹配"ab",也能夠匹配"cd",還能夠匹配"ef".
/\d{3}|[a-z]{4}/
:能夠匹配3個數字,或者4個小寫字母.
(/[a-z]+(\d+)/)
:匹配一個或多個小寫字母后跟隨了一位或多位數字,使用括號包裹後,能夠從檢索到的匹配中抽取數字了.
咱們稱這些元素爲正則表達式的錨,它們將模式定位在搜索字符串的特定位置上.
字 符 | 含 義 |
---|---|
^ |
匹配字符串的開頭,在多行檢索中,匹配一行的開頭 |
$ |
匹配字符串的結尾,在多行檢索中,匹配一行的結尾 |
\b |
匹配一個單詞邊界,簡言之,就是位於字符\w和\W之間的位置,或位於字符\w和字符串的開頭或結尾之間的位置(須要注意:[\b]匹配的是退格符) |
\B |
匹配非單詞邊界的位置 |
例:
/^JavaScript$/
:匹配"JavaScript"單詞
/\B[Ss]cript/
:與"JavaScript"和"/postscript"匹配,但不與"script"與"Script".
說明高級匹配的規則,放在"/"符號以外,第二條斜線後
字 符 | 含 義 |
---|---|
i |
執行不區分大小寫的匹配 |
g |
執行一個全局匹配,簡言之,就是要找到全部的匹配,而不是在找到一個以後就中止 |
m |
多行匹配模式,^匹配一行的開頭和字符串的開頭,$匹配行的結束和字符串的結束 |
例:
/java$/im
:能夠匹配"java"也能夠匹配"Java\nis fun"
正則表達式的做用就是用來解析字符串
search()
:查找字符串,接受一個參數爲正則表達式,返回返回一個與之匹配的子串的起始位置,若未找到返回-1.
例: JavaScript.search(/script/i);//返回4
search()
方法不支持全局屬性檢索,因此會忽略修飾符g
replace()
:用以執行檢索與替換操做,接受兩個參數,第一個參數是一個正則,第二個是要進行替換的字符串
若第一個參數是字符串,replace()
則會直接搜索這個字符串
若替換字符串中出現了$加數字,那麼replace()
將用與指定的子表達式相匹配的文原本替換這兩個字符.
例:
text.replace(/javascript/gi,"JavaScript");//將全部不區分大小寫的javascript都替換成,大小寫正確的JavaScript. //一段引用文本起始於引號,結束與引號. //中間的內容區域,不能包含引號 var quote = /"([^"]*)"/g; //引用中文半角引號替換英文引號,同時要保持引號之間的內容(儲存在$1中)沒有被修改. text.replace(quote,'「$1」');
match()
接受惟一一個參數,就是正則表達式,返回的是一個由匹配結果組成的數組.例:
"1 plus 2 equals 3".match(/\d+/g);//返回["1","2","3"]
若在這個正則表達式中沒有設置修飾符g,match()
就不會進行全局檢索,它只檢索第一個匹配。但即便match()執行的不是全局檢索,它也返回一個數組。在這種狀況下,數組的第一個元素就是匹配的字符串,餘下的元素則是正則表達式中用圓括號括起來的子表達式。
所以,若是macth()返回一個數組a,那麼a[0]存放的是完整的匹配,a[1]存放的是與第一個圓括號括起來的表達式相匹配的子串,以此類推。爲了和方法replace()保持之後,a[n]存放的是$n的內容。
例:解析一個url
var url = /(\w+):\/\/([\w.]+)\/(\S*)/; var text = "Visit my blog at http://www.example.com/~david"; var result = text.match(url); if (result != null) { var fullurl = result[0]; //包含 "http://www.example.com/" var protocol = result[1]; //包含 "http" var host = result[2]; //包含 "www.example.com" var path = result[3]; //包含~david }
split()
用以將調用它的字符串拆分爲子串組成的數組,使用分隔符是split()
的參數
參數爲字符串
"123,456,789".split(",");//返回["123","456","789"]
參數爲正則
"1,2, 3,4 ,5".split(/\s*,\s*/)//返回["1","2"," 3","4 ","5"]
指定分隔符",",容許兩邊能夠留有任意多的空白符
RegExp對象用以建立新的RegExp對象,可接受兩個參數,第二個可選.
RegExp對象的第一個參數爲正則表達式的主體部分,也就是/...../
之間的文本,不管是字符串直接量,仍是正則表達式都使用"\"做爲轉義字符的前綴.
第二個可選參數爲指定正則表達式的修飾符,i
,g
,m
或者他們的組合.參考:文本模式的則表達式-修飾符
例:
var reg = new RegExp("\\d{5}","g");//匹配全局模式下的5個數字 alert(reg.test("1J2a35786"));//true alert(reg.test("1J2a356"));//false
屬性名 | 類型 | 含義 |
---|---|---|
source | 只讀字符串 | 包含正則表達式的文本 |
global | 只讀布爾值 | 用以說明正則表達式是否帶有修飾g |
ignoreCase | 只讀布爾值 | 用以說明正則表達式是否帶有修飾i |
multiline | 只讀布爾值 | 用以說明正則表達式是否帶有修飾m |
lastIndex | 可讀性的整數 | 若匹配模式中含有g ,這個屬性儲存在整個字符串中下一次檢索的開始位置 |