???? 嘿嘿,本文題目取自BeanSoft的評論。
???? 因比較多時候接觸到正則表達式,每次都google比較麻煩,所以花了點時間學習和進行總結,希望對少部分人也有點幫助。
-
?概念及其作用
???????????正則表達式的英文是regular expression,正則表達式,就是用某種模式去匹配一類字符串的一個公式。
?????????? 正則表達式具有如下作用:
????????????1)測試字符串的某種模式。eg. 檢驗在某個字符串中是否存在一個電話號碼和一個身份證號碼;
????????????2)替換文本。eg. 在文本中使用一個正則表達式來標識特定文字,將其替換成其他文字;
??????????? 3)根據指定的模式從字符串中提取一個子字符串。
??? 2.???元字符及描述
元字符
|
? |
描述
|
|
|
|
.
|
|
匹配任何單個字符。例如正則表達式r.t匹配這些字符串:rat、rut、r t,但是不匹配root。? |
$
|
|
匹配行結束符。例如正則表達式weasel$ 能夠匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。? |
^
|
|
匹配一行的開始。例如正則表達式^When in能夠匹配字符串"When in the course of human events"的開始,但是不能匹配"What and When in the"。 |
*
|
|
匹配0或多個正好在它之前的那個字符。例如"zo*"可以匹配"z"和"zoo"等。 |
\
|
|
這是引用符,用來將這里列出的這些元字符當作普通的字符來進行匹配。例如正則表達式\$被用來匹配美元符號,而不是行尾,類似的,正則表達式\.用來匹配點字符,而不是任何字符的通配符。 |
[ ]?
[c
1
-c
2
]
[^c
1
-c
2
]
|
|
匹配括號中的任何一個字符。例如正則表達式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括號中使用連字符-來指定字符的區間,例如正則表達式[0-9]可以匹配任何數字字符;還可以制定多個區間,例如正則表達式[A-Za-z]可以匹配任何大小寫字母。另一個重要的用法是“排除”,要想匹配除了指定區間之外的字符——也就是所謂的補集——在左邊的括號和第一個字符之間使用^字符,例如正則表達式[^269A-Z] 將匹配除了2、6、9和所有大寫字母之外的任何字符。 |
\< \>
|
|
匹配詞(word)的開始(\<)和結束(\>)。例如正則表達式\<the能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是所有的軟件都支持的。 |
\( \)
|
|
將 \( 和 \) 之間的表達式定義為“組”(group),并且將匹配這個表達式的字符保存到一個臨時區域(一個正則表達式中最多可以保存9個),它們可以用 \1 到\9 的符號來引用。 |
|
|
|
將兩個匹配條件進行邏輯“或”(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個元字符不是所有的軟件都支持的。 |
+
|
|
匹配1或多個正好在它之前的那個字符。例如正則表達式9+匹配9、99、999等。注意:這個元字符不是所有的軟件都支持的。 |
?
|
|
匹配0或1個正好在它之前的那個字符。例如,abc?能匹配abc和ab,注意:這個元字符不是所有的軟件都支持的。 |
\{
i
\}
\{
i
,
j
\}
|
|
匹配指定數目的字符,這些字符是在它之前的表達式定義的。例如正則表達式A[0-9]\{3\} 能夠匹配字符"A"后面跟著正好3個數字字符的串,例如A123、A348等,但是不匹配A1234。而正則表達式[0-9]\{4,6\} 匹配連續的任意4個、5個或者6個數字字符。注意:這個元字符不是所有的軟件都支持的。 |
????3.???RegExp對象的屬性和方法
???????? 1)簡述
???????????? 該對象用來完成有關正則表達式的操作和功能;每一條正則表達式模式對應一個RegExp實例,創建RegExp對象的方式如下:
???????????? 顯式構造函數:new ReExp("pattern"[,"flags"]);
???????????? 隱式構造函數(此方法比較常用),采用純文本方式:/pattern/[flags].
???????????? 其中pattern部分為要使用的正則表達式模式文本,是必須的,flags部分設置正則表達式的標志信息,為可選項。flags可以是如下標記的組合:
??????????? g是全局標志。若設置了這個標志,對某個文本執行搜索和替換操作時,將對文本所有匹配的部分起作用,否則,則僅搜索和替換最早匹配的內容;
??????????? i是忽略大小寫標志;
??????????? m是多行標志.
??????????? eg.
<
script?language
=
"
javascript
"
>
<!--
var
?str?
=
?
"
I?am?amigo
"
;
var
?regex?
=
?
new
?RegExp(
"
amigo
"
);
document.write(
"
regex:?
"
?
+
?regex?
+
?
"
<br>
"
);

if
(regex.test(str))?
{
????document.write(
"
找到指定字符串amigo<br>
"
);

}
?
else
?
{
????document.write(
"
未找到指定字符串amigo<br>
"
);
}
var
?regex1?
=
?
/
amigo
/
;

if
(regex1.test(str))?
{
????document.write(
"
找到指定字符串amigo
"
);

}
?
else
?
{
????document.write(
"
未找到指定字符串amigo
"
);
}
//
-->
</
script
>
?????????輸出結果如下:
???????????regex: /amigo/
?????????? 找到指定字符串amigo
?????????? 找到指定字符串amigo
??????? 注意:?由于JavaScript字符串中"\"是一個轉義字符,因此顯式構造函數創建RegExp實例對象時,應將原是政則表達式的"\"用"\\"替換.
??????? eg.
<
script?language
=
"
javascript
"
>
<!--
????
var
?regex1?
=
?
new
?RegExp(
"
\\d{3}
"
);

????
var
?regex2?
=
?
/
\d
{
3
}
/
;
????document.write(
"
regex1:?
"
?
+
?regex1?
+
?
"
<br>
"
);
????document.write(
"
regex2:?
"
?
+
?regex2);
//
-->
</
script
>
???????輸出結果如下:
??????? regex1: /\d{3}/
??????? regex2: /\d{3}/
??????? 由于正則表達式模式文本中的轉義字符也是"\",如果正則表達式中要匹配原義字符"\",在正則表達式模式文本中要以"\\"表示,當顯式的方式來表示時,要用"\\\\"來表示原義字符"\".
????? 2).????屬性
????????? 1)?index:? 當前表達式模式首次匹配內容的開始位置,從0開始計數,?初始值為-1;
??????????2)?input:?? 返回當前所作用的字符串;
????????? 3)lastIndex:?? 是當前表達式模式首次匹配內容中最后一個字符的下一個位置;
??????????4)lastMatch:?? 是當前表達式模式的最后一個匹配字符串;
????????? 5)lastParen:?? 是當前表達式模式中最后的子匹配所匹配的子字符串;
??????????6)leftContext:???當前表達式模式最后一個匹配字符串左邊的所有內容;
????????? 7)rightContext:??當前表達式模式最后一個匹配字符串右邊的所有內容;??
??????????上面所說的屬性為其靜態屬性,下面是其實例屬性:
??????????1) global:???返回標志g的狀態;
????????? 2) ignoreCase:???返回標志i的狀態;
??????????3) multiLine:? 返回標志m的狀態;
??????????4) source:? 返回創建RegExp對象實例時指定的表達式文本字符串.
????? 3)? 方法
??????????? test方法
??????????? exe方法: 語法格式為exex(str).該方法使用創建RegExp對象實例時所指定的表達式模式對一個字符串進行搜索.
????????????compile方法: 語法格式為compile("pattern"[,"flags"]),該方法可以更換RegExp對象實例所使用的表達式模式,并將新的表達式編譯為內部格式,從而使以后的匹配過程執行更快.
??????????? 綜合舉例:
<
script?language
=
"
javascript
"
>
<!--
????
var
?str?
=
?
"
20070310amigo1121happy
"
;

????
var
?regex?
=
?
/
(\d
{
8
}
)amigo(\d
{
4
}
)
/
gi;
????
var
?attr,?count?
=
?
0
;

????
while
(attr?
=
?regex.exec(str))?
{
????????info();
????}
????
function
?info()?
{
????????document.write(
"
source:?
"
?
+
?regex.source?
+
?
"
<br>
"
);
????????document.write(
"
RegExp.index:?
"
?
+
?RegExp.index?
+
?
"
<br>
"
);
????????document.write(
"
RegExp.lastIndex:?
"
?
+
?RegExp.lastIndex?
+
?
"
<br>
"
);
????????document.write(
"
RegExp.lastParen:?
"
?
+
?RegExp.lastParen?
+
?
"
<br>
"
);
????????document.write(
"
RegExp.leftContext?:
"
?
+
?RegExp.leftContext?
+
?
"
<br>
"
);????
????????document.write(
"
RegExp.rightContext?;
"
?
+
?RegExp.rightContext?
+
?
"
<br>
"
);
????????document.write(
"
attr.index:?
"
?
+
?attr.index?
+
?
"
<br>
"
);
????????document.write(
"
attr.lastIndex:?
"
?
+
?attr.lastIndex?
+
?
"
<br>
"
);
????}
//
-->
</
script
>
???????? 輸出結果如下:
????????? source: (\d{8})amigo(\d{4})
?????????RegExp.index: 0
?????????RegExp.lastIndex: 17
?????????RegExp.lastParen: 1121
?????????RegExp.leftContext:
?????????RegExp.rightContext;??happy
?????????attr.index: 0
?????????attr.lastIndex: 17
??? 4.???常用驗證收集
?????????1) 匹配中文字符的正則表達式: [\u4e00-\u9fa5]
?????????2) 匹配雙字節字符(包括漢字在內):[^\x00-\xff]
?????????3) 匹配空白行的正則表達式:\n\s*\r
?????????4) 匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</\1>|<.*? />
????????????評注:上面這個也僅僅能匹配部分,對于復雜的嵌套標記依舊無能為力
?????????5) 匹配首尾空白字符的正則表達式:^\s*|\s*$
????????????評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式
?????????6) 匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
?????????7) 匹配網址URL的正則表達式:[a-zA-z]+://[^\s]*
????????????評注:上面這個基本可以滿足需求
?????????8) 匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
?????????9) 匹配國內電話號碼:\d{3}-\d{8}|\d{4}-\d{7}
????????????評注:匹配形式如 0511-4405222 或 021-87888822
?????????10) 匹配騰訊QQ號:[1-9][0-9]{4,}
????????????評注:騰訊QQ號從10000開始
?????????11) 匹配中國郵政編碼:[1-9]\d{5}(?!\d)?????? (注: 中國郵政編碼為6位數字)
?????????12) 匹配身份證:\d{15}|\d{18}? (注: 中國的身份證為15位或18位)
?????????13) 匹配ip地址:\d+\.\d+\.\d+\.\d+
?????????14) 匹配特定數字:
????????????^[1-9]\d*$ //匹配正整數
????????????^-[1-9]\d*$ //匹配負整數
????????????^-?[1-9]\d*$ //匹配整數
????????????^[1-9]\d*|0$ //匹配非負整數(正整數 + 0)
????????????^-[1-9]\d*|0$ //匹配非正整數(負整數 + 0)
????????????^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮點數
????????????^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配負浮點數
????????????^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮點數
????????????^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非負浮點數(正浮點數 + 0)
????????????^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮點數(負浮點數 + 0)
????????????評注:處理大量數據時有用,具體應用時注意修正
?????????15) 匹配特定字符串:
????????????^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
????????????^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
????????????^?[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
????????????^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串
????????????^\w+$ //匹配由數字、26個英文字母或者下劃線組成的字符串
????????????評注:最基本也是最常用的一些表達式
posted on 2007-03-10 12:02
阿蜜果 閱讀(2870)
評論(4) 編輯 收藏 所屬分類:
Javascript