js——正則匹配

1、示例

匹配網址url

function IsURL(str_url){
    var strRegex = "^((https|http|ftp|rtsp|mms)?://)"
          + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@ 
          + "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184 
          + "|" // 允許IP和DOMAIN(域名)
          + "([0-9a-z_!~*'()-]+\.)*" // 域名- www. 
          + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二級域名 
          + "[a-z]{2,6})" // first level domain- .com or .museum 
          + "(:[0-9]{1,4})?" // 端口- :80 
          + "((/?)|" // a slash isn't required if there is no file name 
          + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"; 
    var re=new RegExp(strRegex); 
    if (re.test(str_url)){
        return (true); 
    }else{ 
        return (false); 
    }
}
var testUrl;
testUrl="harveyzeng.iteye.com/blog/1776991";
alert(IsURL(testUrl));

匹配手機號碼

var mobile = /^(13[0-9]{9})|(18[0-9]{9})|(14[0-9]{9})|(17[0-9]{9})|(15[0-9]{9})$/;
// 或
var mobile = /^1[34578]\d{9}$/;

匹配固話

var tel = /^([0-9]{3,4}-)?[0-9]{7,8}$/;

匹配身份證號碼

var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;

匹配密碼

// 以字母開頭,長度在6-18之間,只能包含字符、數字和下劃線
var password = /^[a-zA-Z]\w{5,17}$/;

匹配一年的12個月

var month = /^(0?[1-9]|1[0-2])$/;

匹配一個月的31天

var day = /^((0?[1-9])|((1|2)[0-9])|30|31)$/;

匹配Email地址

var email = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;

匹配漢字

var n = /^[\u4e00-\u9fa5],{0,}$/;

匹配html標簽

var html = /<(.*)>(.*)<\/(.*)>|<(.*)\/>/;

用正則表達式限制只能輸入中文

onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用正則表達式限制只能輸入數字和英文

onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

2、 可選項修飾符,可以組合使用

  • g : 全文查找
  • i :忽略大小寫
  • m : 多行查找

3、正則表達式模式

表達式 描述
[abc] 匹配 abc 其中的一個
[^abc] 匹配 除abc 之外的字符
(x|y) 匹配 x 或者 y

4、正則表達式中的預定義類

代碼 等同于 匹配
. IE下[^\n],其他[^\n\r] 匹配除了換行和行結束符之外的單個字符
\d [0-9] 匹配數字
\D [^0-9] 匹配非數字字符
\b /\bc/.exec('acbc');匹配右側邊界的c 匹配單詞邊界
\B /\Bc/.exec('bcbc') ;成功地匹配到bcbc中的c 匹配非單詞邊界
\s [\n\r\t\f\x0B] 匹配一個空白字符
\S [^\n\r\t\f\x0B] 匹配一個非空白字符
\w [a-zA-Z0-9_] 匹配字母數字和下劃線
\W [^a-zA-Z0-9_] 匹配除字母數字下劃線之外的字符
\0 查找NULL字符
\n 查找換行符
\xxx 查找以八進制數 xxx 規定的字符
\xdd 查找以十六進制數 dd 規定的字符
\uxxxx 查找以十六進制數 xxxx 規定的 Unicode 字符

5、量詞(下表量詞到{n,m}之前,單個出現時皆是貪婪量詞)

代碼 描述 示例
* 匹配零次或多次 zo* 能匹配 “z” 以及 “zoo” 。等價于 {0,}
+ 匹配一次或多次 'zo+' 能匹配 “zo” 以及 “zoo” ,但不能匹配 “z” 。等價于 {1,}
匹配零次或一次 "do(es)?" 可以匹配 "do" 或 "does" 中的 "do" 。? 等價于 {0,1}
{n} n 是一個非負整數。匹配確定的 n 次 'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o
{n,} n 是一個非負整數,至少匹配 n 次 'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。 'o{1,}' 等價于 'o+' 。 'o{0,}' 則等價于 'o*'
{n,m} m 和 n 均為非負整數,其中n<=m。最少匹配n次且最多匹配m次 "o{1,3}" 將匹配 "fooooood" 中的前三個 o。 'o{0,1}' 等價于 'o?' 。請注意在逗號和兩個數之間不能有空格
n$ 匹配以n結尾的字符串
^n 匹配以n開頭的字符串
?=n 匹配任何其后緊接指定字符串n的字符串 (?=pattern)所謂正向預查,意思就是:要匹配的字符串,后面必須緊跟著pattern。我們知道正則表達式/cainiao/會匹配cainiao。同樣,也會匹配cainiao9中的cainiao。但是我們可能希望,cainiao只能匹配cainiao8中的cainiao。這時候就可以像下面這樣寫:/cainiao(?=8)/
?!n 匹配任何其后沒有緊接指定字符串n的字符串

6、 貪婪量詞與惰性量詞

貪婪量詞進行匹配時,它首先會將整個字符串當成一個匹配,如果匹配的話就退出。如果不匹配,就把最后一個字符去掉再進行匹配,不匹配繼續去掉最后一個字符,直到找到一個匹配或者不剩任何字符為止

惰性量詞進行匹配時,先看第一個字符串是否匹配,如果不匹配就加入第二個字符串以此類推,直到找到一個匹配或者不剩任何字符為止

// 惰性量詞僅僅在貪婪量詞后面加個"?"而已,如"a+"是貪婪匹配的,"a+?"則是惰性的 
var str = "abc";
var re = /\w+/; // 將匹配abc
re = /\w+?/; // 將匹配a

7、分組與非捕獲性分組

    re = /abc{2}/;//將匹配abcc  
    re = /(abc){2}/;//將匹配abcabc  
    //上面的分組都是捕獲性分組  
    str = "abcabc ###";  
    arr = re.exec(str);  
    alert(arr[1]);//abc  
    //非捕獲性分組 (?:)  
    re = /(?:abc){2}/;  
    arr = re.exec(str);  
    alert(arr[1]);//undefined  

8、反向引用

當包含分組的正則表達式進行過test,match,search這些方法之后,每個分組都被放在一個特殊的地方以備將來使用,這些存儲是分組中的特殊值,我們稱之為反向引用

var re = /(A?(B?(C?)))/;  
/*上面的正則表達式將依次產生三個分組 
(A?(B?(C?))) 最外面的 
(B?(C?)) 
(C?)*/  
str = "ABC";  
re.test(str);//反向引用被存儲在RegExp對象的靜態屬性1-9中  
alert(RegExp.$1+"\n"+RegExp.$2+"\n"+RegExp.$3);  
//反向引用也可以在正則表達式中使用\1 ,\2...這類的形式使用  
re = /\d+(\D)\d+\1\d+/;  
str = "2008-1-1";  
alert(re.test(str));//true  
str = "2008-4_3";  
alert(re.test(str));//false 

// 使用反向引用可以要求字符串中某幾個位置上的字符必須相同.另外,在replace這類方法中可用特殊字符序列來表示反向引用 
re = /(\d)\s(\d)/;  
str = "1234 5678";  
alert(str.replace(re,"21"));//在這個里面1表示第一個分組1234,2則表示5678  

9、正向前瞻

正向前瞻,用來捕獲出現在特定字符之前的字符,只有當字符后面跟著某個特定字符才去捕獲它。與正向前瞻對應的有負向前瞻,它用匹配只有當字符后面不跟著某個特定字符時才去匹配它。在執行前瞻和負向前瞻之類的運算時,正則表達式引擎會留意字符串后面的部分,然而卻不移動index

    //正向前瞻  
    re = /([a-z]+(?=\d))/i;  
    //我們要匹配后面跟一個數字的單詞,然后將單詞返回,而不要返回數字  
    str = "abc every1 abc";  
    alert(re.test(str));//true  
    alert(RegExp.$1);//every  
    alert(re.lastIndex);//使用前瞻的好處是,前瞻的內容(?=\d)并不會當成一次匹配,下次匹配仍從它開始  
    //負向前瞻(?!)  
    re = /([a-z](?!\d))/;i  
    //將匹配后面不包含數字的字母,并且不會返回(?!\d)中的內容  
    str = "abc1 one";  
    alert(re.test(str));  
    alert(RegExp.$1);//one  

10、正則表達式對象的方法

match: 使用正則表達式模式對字符串執行查找,并將包含查找的結果作為數組返回

stringObj.match(rgExp)
// 如果match的表達式匹配了全局標記g將出現所有匹配項,而不用循環,但所有匹配中不會包含子匹配項

exec: 用正則表達式模式在字符串中運行查找,并返回包含該查找結果的第一個值(數組),如果匹配失敗,返回null
test: 返回一個Boolean值,它指出在被查找的字符串中是否匹配給出的正則表達式。
search: 返回與正則表達式查找內容匹配的第一個子字符串的位置(偏移位),如果沒有返回-1
replace: 返回根據正則表達式進行文字替換后的字符串的復制

// 語法:
stringObj.replace(rgExp, replaceText)
// 示例
function f2c(s) {
    var test = /([\d]{4})-([\d]{1,2})-([\d]{1,2})/;
    return(s.replace(test,  function($0,$1,$2,$3) {
        return($2 +"/" + $1);
    }));
}
document.write(f2c("today: 2011-03-29")); 
// 輸出:today: 03/2011

split: 將一個字符串分割為子字符串,然后將結果作為字符串數組返回
compile: 用于在腳本執行過程中編譯正則表達式;也可用于改變和重新編譯正則表達式

// 語法
stringObj.compile(rgExp,可選項修飾符(見2))
// 示例
var str="Every man in the world! Every woman on earth!";

patt=/man/g;
str2=str.replace(patt,"person");
document.write(str2+"<br />");

patt=/(wo)?man/g;
patt.compile(patt);
str2=str.replace(patt,"person");
document.write(str2);

/* 輸出:
Every person in the world! Every woperson on earth!
Every person in the world! Every person on earth!
*/

11、 正則表達式對象的屬性

source: 返回正則表達式模式的文本的復本,只讀

var re = /[a-z]/i;  
alert(re.source);//將[a-z]字符串輸出  
//請注意,直接alert(re)會將正則表達式連同前向斜線與標志輸出,這是re.toString方法定義的 

lastindex: 返回字符位置,它是被查找字符串中下一次成功匹配的開始位置,默認值是-1

    var re = /[A-Z]/;  
    //exec方法執行后,修改了re的lastIndex屬性,  
    var str = "Hello,World!!!";  
    var arr = re.exec(str);  
    alert(re.lastIndex);//0,因為沒有設置全局標志  
    re = /[A-Z]/g;  
    arr = re.exec(str);  
    alert(re.lastIndex);//1  
    arr = re.exec(str);  
    alert(re.lastIndex);//7  

1-9: 返回九個在模式匹配期間找到的、最近保存的部分。只讀。
input($_):返回執行規范表述查找的字符串。只讀

//input 最后用于匹配的字符串(傳遞給test,exec方法的字符串)  
var re = /[A-Z]/;  
var str = "Hello,World!!!";  
var arr = re.exec(str);  
alert(RegExp.input);//Hello,World!!!  
re.exec("tempstr");  
alert(RegExp.input);//仍然是Hello,World!!!,因為tempstr不匹配  

lastMatch($&): 返回任何正則表達式搜索過程的最后匹配的字符。只讀

//lastMatch 最后匹配的字符  
re = /[a-z]/g;  
str = "hi";  
re.test(str);  
alert(RegExp.lastMatch);//h  
re.test(str);  
alert(RegExp["$&"]);//i  ,$&是lastMatch的短名字,但它不是合法變量名  

lastParen($+): 如果有的話,返回任何正則表達式查找過程中最后包括的子匹配。只讀

//lastParen 最后匹配的分組  
re = /[a-z](\d+)/gi;  
str = "Class1 Class2 Class3";  
re.test(str);  
alert(RegExp.lastParen);//1  
re.test(str);  
alert(RegExp["$+"]);//2  

leftContext($`): 返回被查找的字符串中從字符串開始位置到最后匹配之前的位置之間的字符。只讀
rightContext($''): 返回被搜索的字符串中從最后一個匹配位置開始到字符串結尾之間的字符。只讀

//leftContext  返回被查找的字符串中從字符串開始位置到最后匹配之前的位置之間的字符  
//rigthContext 返回被搜索的字符串中從最后一個匹配位置開始到字符串結尾之間的字符  
re = /[A-Z]/g;  
str = "123ABC456";  
re.test(str);  
alert(RegExp.leftContext);//123  
alert(RegExp.rightContext);//BC456  
re.test(str);  
alert(RegExp["$`"]);//123A  
alert(RegExp["$'"]);//C456  

multiline($*): 屬性返回正則表達式是否使用多行模式。這個屬性不針對某個正則表達式實例,而是針對所有正則表達式

//因為IE,Opera不支持這個屬性,所以最好還是單獨指定
var re = /\w+/m;  
alert(re.multiline);  
alert(RegExp["$*"]);//RegExp對象的靜態屬性不會因為給RegExp某個對象實例指定了m標志而改變  
RegExp.multiline = true;//這將打開所有正則表達式實例的多行匹配模式  
alert(RegExp.multiline);  

使用元字符注意事項: 元字符是正則表達式的一部分,當要匹配正則表達式本身時,必須對這些元字符轉義
所有元字符: () [] {} \ ^ $ | ? * + .

var str = "?";
var re = /?/;
alert(re.test(str)); 出錯,因為?是元字符,必須轉義
re = /\?/;
alert(re.test(str)); // true

參考:
http://www.cnblogs.com/zfc2201/archive/2012/12/18/2824107.html
http://www.jb51.net/article/28007.htm
http://www.cnblogs.com/aaronjs/archive/2012/06/30/2570970.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容