RegExp 對象用于規(guī)定在文本中檢索的內(nèi)容。
簡單的模式可以是一個單獨(dú)的字符。
更復(fù)雜的模式包括了更多的字符,并可用于解析、格式檢查、替換等等。
定義量
var pattern=/a$/; //第一種
var patterns=new RegExp("a$"); //第二種
修飾符
i:不區(qū)分大小寫
g:global,全局
gi:不區(qū)分大小寫的全局
m:多行的不知道跟全局有什么區(qū)別
var att="My name is mian mian";
var pattern=/an/g; //global,全局
document.write(att.match(pattern)); //an,an
表達(dá)式
[abc]
查找方括號之間的任何字符。
[^abc]
查找任何不在方括號之間的字符。
[0-9]
查找任何從 0 至 9 的數(shù)字。
[a-z]
查找任何從小寫 a 到小寫 z 的字符。
[A-Z]
查找任何從大寫 A 到大寫 Z 的字符。
[A-z]
查找任何從大寫 A 到小寫 z 的字符。
[adgk]
查找給定集合內(nèi)的任何字符。
[^adgk]
查找給定集合外的任何字符。
red|blue
查找任何指定的選項(xiàng)。
var att="Mynameismianmianred";
var pattern=/is|an/g;
document.write(att.match(pattern)); //is,an,an
元字符
[.]
查找單個字符,除了換行和行結(jié)束符。
多少個點(diǎn)就是后面還有多少個字符
var att="Mynameismianmianred";
var pattern=/is./g;
document.write(att.match(pattern));
[\w]
查找單詞字符。
[\W]
查找非單詞字符。
\b
單詞的邊界
使用單詞的邊界來代替真正的空格符進(jìn)行匹配,可以避免如
var att=/\slanguage\s/;
m="javascript is a 'good' language";
document.write(m.match(att)); //null
明明是有的,卻像找不到一樣
var att=/\blanguage\b/;
m="javascript is a 'good' language";
document.write(m.match(att)); //language
\B
非單詞邊界,將把匹配的錨點(diǎn)定位在不是單詞的邊界之處,
var att=/\Blanguage\B/;
ar patt=/\Bscrip\B/;
m="javascript is a 'good' language";
document.write(m.match(att)); //null
document.write(m.match(patt)) //scrip;
[\d]
查找數(shù)字。
[\D]
查找非數(shù)字字符。
[\s]
查找空白字符。
[\S]
查找非空白字符。
注意:在方括號內(nèi)也可以寫這些特殊轉(zhuǎn)義符,但是跟不用方括號的時候有一點(diǎn)點(diǎn)小小的區(qū)別,例如:
var att="My name is 444n";
var pattern=/[\d\S]/g;
document.write(att.match(pattern));
//M,y,n,a,m,e,i,s,4,4,4,n
不用方括號
var att="My name is 444n";
var pattern=/\d\S/g;
document.write(att.match(pattern)); //44,4n
直接的話意思就會成為是說一個數(shù)字一個非Unicode空白字符的字符,因而需要加上一個或的符號’|'
var att="My name is 444n";
var pattern=/\d|\S/g;
document.write(att.match(pattern));
//M,y,n,a,m,e,i,s,4,4,4,n
另外,轉(zhuǎn)義符\b
具有特殊含義,當(dāng)用在字符類中的時候,它表示的是退格符,所以要在正則表達(dá)式中按照直接量表示一個退格符只需要使用一個元素的字符類/[\b]/
,而如果直接寫做/\b/
就會表達(dá)為匹配單詞界。如:
var att="My name is 444n\b";
var pattern=/\b/g;
document.write(att.match(pattern));//,,,,,,,
var pattern=/[\b]/g;
document.write(att.match(pattern));//輸出空白而不是null
重復(fù)字符語法
[n+]
匹配任何包含至少一個n 的字符串。
var str="you are a good boy!";
var patt1=/o+/g;
document.write(str.match(patt1)); //o,oo,o
查找單詞:
var pattern=/\w+/g; //匹配至少一個單詞字符,而空格不算進(jìn)內(nèi),所以就是分單詞了
document.write(att.match(pattern)); //My,name,is,444n
[n*]
匹配任何包含零個或多個 n 的字符串。
var patt1=/o*/g;
document.write(str.match(patt1));
//,o,,,,,,,,,,oo,,,,o,,, //輸出結(jié)果把其他的都忽略掉
另外,對 "l" 進(jìn)行全局搜索,包括其后緊跟的一個或多個 "o",這樣也可以查詢一些其他的比如1開頭,其后有一個或多個0的數(shù)據(jù):
var att="lolololllll\b";
var pattern=/lo*/g;
document.write(att.match(pattern)); //lo,lo,lo,l,l,l,l,l
然而需要注意的是,這些字符可能匹配0個字符,因此可能什么都不匹配。
var att="My name is xiaomian";
var pattern=/\z*/g;
if(att.match(pattern))
document.write("true"); //att中未出現(xiàn)z,然而還是匹配成功
[n?]
匹配任何包含零個或一個 n 的字符串,使用方法與[n*]有點(diǎn)類似。
[n{X}]
匹配包含 X 個 n 的序列的字符串。
var att="wo shi 小小娩 ";
var pattern=/\S{3}/g;
document.write(att.match(pattern)); //shi,小小娩
var pattern=/\小{2}./g;
document.write(att.match(pattern)); //小小娩
[n{X,Y}]
匹配包含 X 或 Y 個 n 的序列的字符串。只是一個或的關(guān)系,其他的沒什么區(qū)別吧
[n{X,}]
匹配包含至少 X 個 n 的序列的字符串。
var att="we are the best!";
var pattern=/\S{2,}/g;
document.write(att.match(pattern)); //we,are,the,best!
[n$]
匹配任何結(jié)尾為 n 的字符串。
var att="we are the best!";
var pattern=/....!$/g;
document.write(att.match(pattern)); //best!
[^n]
匹配任何開頭為 n 的字符串,與[n$]
類似。
[?=n]
匹配任何其后緊接指定字符串 n 的字符串。
var att="我是小娩";
var pattern=/是(?=小)../g;
document.write(att.match(pattern)); //是小娩
[?!n]
匹配任何其后沒有緊接指定字符串 n 的字符串。與[?=n]類似
圓括號的作用
- 把單獨(dú)的項(xiàng)合成子表達(dá)式,以便可以像處理一個獨(dú)立的單元那樣使用
|
、‘、*
等來對單元內(nèi)的項(xiàng)來進(jìn)行處理。例如:
var att="javascript and java";
var pattern=/java(script)?/g;
console.log(att.match(pattern)); //["javascript", "java"] - 在完整模式中定義子模式。當(dāng)一個正則表達(dá)式成功地和目標(biāo)字符串相匹配時,可以從目標(biāo)串中抽出和圓括號中的子模式想匹配的部分
- 允許在同一正則表達(dá)式的后部引用前面的子表達(dá)式。
這是通過在字符"\"
后加一位或多位數(shù)字來實(shí)現(xiàn)的。這個數(shù)字指定了帶圓括號的子表達(dá)式在正則表達(dá)式中的位置。如:
\1引用的是第一個帶圓括號的子表達(dá)式,\3引用的是第三個帶圓括號的子表達(dá)式。例如:
var att=/(java(script)?)\sis\s/ ;
中(script)就可以用\2來指代
用于模式匹配的String方法
search()
:它的參數(shù)是一個正則表達(dá)式,返回第一個與之匹配的字串的起始位置,如果找不到匹配的字串,則會返回-1;
var patt=/\Bscrip\B/;
m="javascript is a 'good' language";
document.write(m.search(patt)); //4
search()不支持全局檢索,在檢查到第一個后就馬上返回了。
replace()
:用來檢索和替換操作。第一個參數(shù)是正則表達(dá)式,第二個參數(shù)是要進(jìn)行替換的字符串
如果 regexp 具有全局標(biāo)志 g,那么 replace() 方法將替換所有匹配的子串。否則,它只替換第一個匹配子串。
var str="Visit Microsoft and Microsoft welcome you!"
document.write(str.replace(/Microsoft/g,"W3S"));
//Visit W3S and W3S welcome you!
$1、$2、...、$99 與 regexp 中的第 1 到第 99 個子表達(dá)式相匹配的文本。
$& 與 regexp 相匹配的子串。
$`: 位于匹配子串左側(cè)的文本。
$': 位于匹配子串右側(cè)的文本。
$$:直接量符號。
name = "Doe, John";
document.write(name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1")); //John Doe
match()
:它的唯一參數(shù)就是一個正則表達(dá)式,返回一個由匹配結(jié)果組成的數(shù)組。
split()
方法,使用跟字符串的分割有點(diǎn)類似。
RegExp方法
test()
:如果包含匹配結(jié)果則返回true
exec()
:對一個指定的字符串執(zhí)行一個正則表達(dá)式,返回一個數(shù)組,并提供關(guān)于本次匹配的完整信息,當(dāng)具有g(shù)時,它將當(dāng)前正則表達(dá)式對象的lastIndex屬性設(shè)置為所指示的字符串開始檢索,每次查找之前都要設(shè)置為0;