JavaScript RegExp 對象
RegExp 是正則表達式的縮寫
當您檢索某個文本時,可以使用一種模式來描述要檢索的內容。RegExp 就是這種模式
定義 RegExp
new 關鍵詞來定義 RegExp 對象
`var patt1=new RegExp("e");
RegExp 對象的方法
RegExp 對象有 3 個方法:test()、exec() 以及 compile()。
test()
test() 方法檢索字符串中的指定值。返回值是 true 或 false。
<script>
var patt1=new RegExp("e");
document.write(patt1.test('hello world!!!'))// 輸出結果:true
</script>
exec()
exec() 方法檢索字符串中的指定值。返回值是被找到的值。如果沒有發現匹配,則返回 null。
<script>
var patt1=new RegExp("e");
document.write(patt1.exec('hello world exit!!!'))// 輸出結果:e
</script>
RegExp第二個參數,"g",匹配全局匹配
<script>
var patt1=new RegExp("e","g");
do{
var result=patt1.exec('hello world exit!!!');
document.write(result)
}while(result!=null)
//輸出結果:eenull
</script>
compile()
compile() 方法用于改變 RegExp。
compile() 既可以改變檢索模式,也可以添加或刪除第二個參數。
<script>
var patt1=new RegExp("e","g");
document.write(patt1.test('hello world !!! exit'))//輸出結果:true
patt1.compile('a');//改變RegExp,相當于:patt1=new RegExp("a");
document.write(patt1.test('hello world !!! exit'))//輸出結果:false
</script>
創建正則表達式
var r = /a/;
正則.test(字符串)
正則去匹配字符串,如果匹配成功就返回真,如果匹配失敗就返回假
var str = 'abcdef';
var re = /b/;
alert( re.test(str) );
轉義字符
^:匹配開始位置
$:匹配結束位置
\s : 空格 包括 tab 和 換行
\S : 非空格
\d : 數字
\D : 非數字
\w : 字符 ( 字母 ,數字,下劃線_ )單個字符 [a-zA-Z_0-9]
\W : 非字符
(大寫都是反義)
.:任意單個字符
*:可以匹配任意多次,0-n
+:至少匹配一次,1-n
{min,max}:匹配次數:min-max
? :問號 容許匹配一次,但非必須
[abc] a, b, or c (簡單類)
[^abc] 除了a、b或c之外的任意 字符(求反)
[a-zA-Z] a到z或A到Z ,包含(范圍)
[a-z-[bc]] a到z,除了b和c : [ad-z](減去)
[a-z-[m-p]] a到z,除了m到 p: [a-lq-z]
pl:判斷5-12位的qq號
/^\d{5-12}$/
例子: 判斷是否全為數字
var str = '374829348791';
var re = /\D/;
if( re.test(str) ){
alert('不全是數字');
}
else{
alert('全是數字');
}
字符串.search(正則)
正則去匹配字符串 , 如果匹配成功,就返回匹配成功的位置,如果匹配失敗就返回 -1
var str = 'abcdef';
var re = /b/;
alert( str.search(re) );
正則中的默認 : 是區分大小寫的
如果不區分大小寫的話,在正則的最后加標識 i
var str = 'abcdef';
var re = /B/i;//ignore 忽略大小寫
alert( str.search(re) );
字符串.match(正則)
正則去匹配字符串,如果匹配成功,就返回匹配成功的數組,如果匹配不成功,就返回null
var str = 'haj123sdk54hask33dkhalsd879';
var re = /\d/;
alert( str.match(re) );
正則默認:正則匹配成功就會結束,不會繼續匹配
如果想全部查找,就要加標識 g(全局匹配)
var str = 'haj123sdk54hask33dkhalsd879';
var re = /\d/g;//global 全局
alert( str.match(re) );
查找連在一起的數字
var str = 'haj123sdk54hask33dkhalsd879';
var re = /\d\d/g;
alert( str.match(re) );//只會找到12 54 33 87
量詞 : 匹配不確定的位置
+
: 至少出現一次,連續的數組是一個值,沒有+號的話,每個值是單獨的
var str = 'haj123sdk54hask33dkhalsd879';
var re = /\d+/g;
alert( str.match(re) );
//返回結果 ["123", "54", "33", "879"]
字符串.replace(正則,新的字符串)
正則去匹配字符串,匹配成功的字符去替換成新的字符串
var str = 'aaa';
var re = /a+/g;
str = str.replace(re,'b');
alert(str);
例子:關鍵字過濾
//菲稱仁愛礁附近17艘中國船均在菲軍監視之下
//| : 或的意思
//replace : 第二個參數:可以是字符串,也可以是一個回調函數
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<textarea name="" id="before" cols="30" rows="10"></textarea>
<textarea name="" id="after" cols="30" rows="10"></textarea>
<button>過濾</button>
<script>
//菲稱仁愛礁附近17艘中國船均在菲軍監視之下
var before = document.querySelector('#before');
var after = document.querySelector('#after');
var button = document.querySelector('button');
button.onclick = function(){
var str = before.value;
var re = /菲稱|中國船|監視之下/g;
str = str.replace(re, function(str){
var result = '';
for(var i=0;i<str.length;i++){
result += '*';
}
return result;
});
after.value = str;
}
</script>
</body>
</html>
匹配子項 : 小括號 () (還有另外一個意思,分組操作)
把正則的整體叫做(母親)
然后把左邊第一個小括號里面的正則,叫做這個第一個子項(母親的第一個孩子)
第二個小括號就是第二個孩子
var str = '2013-6-7';
var re = /(\d+)(-)/g;
str = str.replace(re,function($0,$1,$2){
//第一個參數:$0(母親),第二個參數 : $1(第一個孩子)
//,第二個參數 : $1(第二個孩子)
//alert( $2 );
return $1 + '.';
});
alert( str ); //2013.6.7
字符類
一組相似的元素 [] 中括號的整體代表一個字符
var str = 'abc';
var re = /a[bde]c/;
alert( re.test(str) );
排除 : ^ 如果^寫在[]里面的話,就代表排除的意思
var str = 'afc';
var re = /a[^bde]c/;
alert( re.test(str) );
var str = 'abc';
var re = /a[a-z0-9A-Z]c/;
alert( re.test(str) );
例子:過濾標簽
替換前<br />
<textarea>
</textarea><br />
替換后<br />
<textarea>
</textarea><br />
<input type="button" value="確定" id="input1" />
<script>
window.onload = function(){
var aT = document.getElementsByTagName('textarea');
var oInput = document.getElementById('input1');
//var re = /<\w+>/g;
var re = /<[^>]+>/g;
oInput.onclick = function(){
aT[1].value = aT[0].value.replace(re,'');
};
};
</script>
轉義字符
. : 任意字符
\. : 真正的點
\b : 獨立的部分 ( 起始,結束,空格 )
\B : 非獨立的部分
//var str = 'one two';
var str = 'onetwo';
var re = /one\b/;
alert( re.test(str) );
量詞 : {}
{4,7} : 最少出現4次,最多出現7次
{4,} : 最少出現4次
{4} : 正好出現4次
- : {1,}
? : {0,1} : 出現0次或者1次
- : {0,} : 至少出現0次*/
例子:判斷是不是qq號
var re = /^[1-9]\d{4,11}$/;
郵箱:
var re = /^\w+@[a-z0-9]+(\.[a-z]+){1,3}$/;
重復的子項
\1 : 重復的第一個子項
\2 : 重復的第二個子項
var str = 'abca';
var re = /(a)(b)(c)\2/;//表示重復第二個子項,即同:var re= /(a)(b)(c)(b)/;
alert( re.test(str) )
下面寫法的區別
var re = /\w\w/; //c9
var re = /(\w)\1/; //cc 99
例子: 找重復項最多的字符和個數
//將字符串分割成數組
var str = 'assssjdssskssalsssdkjsssdss';
//將字符串分割成數組
var arr = str.split('');
//在用數組的方法排序,然后用join方法還原字符串;
str = arr.sort().join('');
// alert(str);
var value = '';
var index = 0;
var re = /(\w)\1+/g;//這里\1是指與上一個字符相同
str.replace(re,function($0,$1){
//alert($0);
if(index<$0.length){
index = $0.length;
value = $1;
}
});
alert('最多的字符:'+value+',重復的次數:'+index);