JavaScript之正則RegExp

     正則表達式,又稱規則表達式正則表一般被用來檢索、替換那些符合某個模式(規則)的文本。javascript

     許多程序設計語言都支持利用正則表達式進行字符串操做。在js中提供了一個RegExp對象來表示正則表達式 。java

    語法: var patt=new RegExp(pattern,modifiers); 或者 var patt=/pattern/modifiers; 模式( pattern )描述了一個表達式模型,修飾符(modifiers)描述了檢索是不是全局,區分大小寫等。正則表達式

    RegExp 模式:

方括號:數組

方括號用於查找某個範圍內的字符:spa

表達式 描述
[abc] 查找方括號之間的任何字符。
[^abc] 查找任何不在方括號之間的字符。
[0-9] 查找任何從 0 至 9 的數字。
[a-z] 查找任何從小寫 a 到小寫 z 的字符。
[A-Z] 查找任何從大寫 A 到大寫 Z 的字符。
[A-z] 查找任何從大寫 A 到小寫 z 的字符。
[adgk] 查找給定集合內的任何字符。
[^adgk] 查找給定集合外的任何字符。
(red|blue|green) 查找任何指定的選項。

元字符:設計

元字符(Metacharacter)是擁有特殊含義的字符:code

元字符 描述
. 查找單個字符,除了換行和行結束符。
\w 查找單詞字符。
\W 查找非單詞字符。
\d 查找數字。
\D 查找非數字字符。
\s 查找空白字符。
\S 查找非空白字符。
\b 匹配單詞邊界。
\B 匹配非單詞邊界。
\0 查找 NUL 字符。
\n 查找換行符。
\f 查找換頁符。
\r 查找回車符。
\t 查找製表符。
\v 查找垂直製表符。
\xxx 查找以八進制數 xxx 規定的字符。
\xdd 查找以十六進制數 dd 規定的字符。
\uxxxx 查找以十六進制數 xxxx 規定的 Unicode 字符。

量詞:regexp

量詞 描述
n+ 匹配任何包含至少一個 n 的字符串。
n* 匹配任何包含零個或多個 n 的字符串。
n? 匹配任何包含零個或一個 n 的字符串。
n{X} 匹配包含 X 個 n 的序列的字符串。
n{X,Y} 匹配包含 X 或 Y 個 n 的序列的字符串。
n{X,} 匹配包含至少 X 個 n 的序列的字符串。
n$ 匹配任何結尾爲 n 的字符串。
^n 匹配任何開頭爲 n 的字符串。
?=n 匹配任何其後緊接指定字符串 n 的字符串。
?!n 匹配任何其後沒有緊接指定字符串 n 的字符串。

    RegExp 修飾符:

    修飾符用於執行是否區分大小寫和全文的搜索。 i - 修飾符是用來執行不區分大小寫的匹配。g - 修飾符是用於執行全文的搜索(而不是在找到第一個就中止查找,而是找到全部的匹配)。 m - 執行多行匹配。對象

    RegExp 對象屬性:

//global 屬性用於返回正則表達式是否具備標誌 "g"。它聲明瞭給定的正則表達式是否執行全局匹配。
//若是 g 標誌被設置,則該屬性爲 true,不然爲 false。
var reg=RegExp('t');
reg.global;//false

//ignoreCase 屬性規定是否設置 "i" 標誌。若是設置了 "i" 標誌,則返回 true,不然返回 false。
reg.ignoreCase;//false

//lastIndex 屬性用於規定下次匹配的起始位置。該屬性是可讀可寫的。只要目標字符串的下一次搜索開始,
//就能夠對它進行設置。當方法 exec() 或 test() 再也找不到能夠匹配的文本時,它們會自動把 lastIndex 屬性重置爲 0。
//不具備標誌 g 和不表示全局模式的 RegExp 對象不能使用 lastIndex 屬性。
//若是在成功地匹配了某個字符串以後就開始檢索另外一個新的字符串,須要手動地把這個屬性設置爲 0。
var str = "The rain in Spain stays mainly in the plain";
var patt = new RegExp("ain", "g");
patt.test(str);//true
patt.lastIndex;//8
patt.lastIndex=10;//10
patt.test(str);//true
patt.lastIndex;//17

//multiline 屬性用於返回正則表達式是否具備標誌 m。它聲明瞭給定的正則表達式是否以多行模式執行模式匹配。
//在這種模式中,若是要檢索的字符串中含有換行符,^ 和 $ 錨除了匹配字符串的開頭和結尾外還匹配每行的開頭和結尾。
//若是 m 標誌被設置,則該屬性爲 true,不然爲 false。
reg.multiline;//false

//source 屬性用於返回模式匹配所用的文本。該文本不包括正則表達式直接量使用的定界符,也不包括標誌 g、i、m。
reg.source;//"t"

    RegExp 對象方法:

//exec() 方法用於檢索字符串中的正則表達式的匹配。返回一個數組,其中存放匹配的結果。若是未找到匹配,則返回值爲 null
//exec()功能很是強大,它是一個通用的方法,並且使用起來也比 test() 方法以及支持正則表達式的 String 對象的方法更爲
//複雜。若是 exec() 找到了匹配的文本,則返回一個結果數組。不然,返回 null。
//此數組的第 1 個元素是與正則表達式相匹配的文本,第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本
//(若是有的話),第 3 個元素是與 RegExpObject 的第 3 個子表達式相匹配的文本(若是有的話),以此類推。
//除了數組元素和 length 屬性以外,exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。
//input 屬性則存放的是被檢索的字符串 string。咱們能夠看得出,在調用非全局的 RegExp 對象的 exec() 方法時,
//返回的數組與調用方法 String.match() 返回的數組是相同的。
var str = "The rain in Spain stays mainly in the plain";
var reg=RegExp('t');
var rexec=reg.exec(str);
rexec.length;//1
rexec.input;//"The rain in Spain stays mainly in the plain"
rexec;//Array [ "t" ]
//當 RegExpObject 是一個全局正則表達式時,exec() 的行爲就稍微複雜一些。
//它會在 RegExpObject 的 lastIndex 屬性指定的字符處開始檢索字符串 string。當 exec() 
//找到了與表達式相匹配的文本時,在匹配後,它將把 RegExpObject 的 lastIndex 屬性設置爲匹配文本的最後一個字符的
//下一個位置。這就是說,您能夠經過反覆調用 exec() 方法來遍歷字符串中的全部匹配文本。當 exec() 再也找不到匹配的
//文本時,它將返回 null,並把 lastIndex 屬性重置爲 0。
//若是在一個字符串中完成了一次模式匹配以後要開始檢索新的字符串,就必須手動地把 lastIndex 屬性重置爲 0。
//不管 RegExpObject 是不是全局模式,exec() 都會把完整的細節添加到它返回的數組中。這就是 exec() 與 
//String.match() 的不一樣之處,後者在全局模式下返回的信息要少得多。所以咱們能夠這麼說,在循環中反覆地調用 exec()
//方法是惟一一種得到全局模式的完整模式匹配信息的方法。
var reg2=RegExp('t','ig');
var rexec2=reg2.exec(str);
rexec2;//Array [ "T" ]
reg2.lastIndex;//1

var rexec3=reg2.exec(str);
rexec3;//Array [ "t" ]

reg2.lastIndex;//20
var rexec4=reg2.exec(str);

rexec4;//Array [ "t" ]
reg2.lastIndex;//35

var rexec5=reg2.exec(str);
rexec5;//null
reg2.lastIndex;//0


//test() 方法用於檢測一個字符串是否匹配某個模式.若是字符串 string 中含有與 模式 匹配的文本,則返回 true,
//不然返回 false。調用 RegExp 對象的 test() 方法,併爲它傳遞字符串 s,
//與這個表示式是等價的:(r.exec(s) != null)。
reg2.test(str);//true


//compile() 方法用於在腳本執行過程當中編譯正則表達式。compile() 方法也可用於改變和從新編譯正則表達式。
//RegExpObject.compile(regexp,modifier);regexp是正則表達式。modifier規定匹配的修飾符。
var str="Every man in the world! Every woman on earth!";
var patt=/man/g;
var str2=str.replace(patt,"person");
str2;//"Every person in the world! Every woperson on earth!"
patt=/(wo)?man/g;
patt.compile(patt);
str3=str.replace(patt,'person');
str3;//"Every person in the world! Every person on earth!"

    支持正則表達式的 String 對象的方法: search , match , replace , split 。ip

相關文章
相關標籤/搜索