linux正則表示式的運用
說 明:正則表示式通常用於兩種任務:1.驗證,2.搜尋/替換。用於驗證時,通常需要在前後分別加上^和$,以匹配整個待驗證字串;搜尋/替換時是否加上 此限定則根據搜尋的要求而定,此外,也有可能要在前後加上\b而不是^和$。此表所列的常用正則表示式,除個別外均未在前後加上任何限定,請根據需要,自 行處理。
匹配9-15個由字母/數字組成的字串的正則表示式:
^[A-Za-z0-9]{9,15}$
只可輸入中文、字母和數字:
[a-zA-Z\u4e00-\u9fa5][a-zA-Z0-9\u4e00-\u9fa5]+
說明 | 正則表示式 |
---|---|
網址(URL) | [a-zA-z]+://[^\s]* |
IP地址(IP Address) | ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) |
電子郵件(Email) | \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* |
QQ號碼 | [1-9]\d{4,} |
HTML標記(包含內容或自閉合) | <(.*)(.*)>.*<\/\1>|<(.*) \/> |
密碼(由數字/大寫字母/小寫字母/標點符號組成,四種都必有,8位以上) | (?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$ |
日期(年-月-日) | (\d{4}|\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9])) |
日期(月/日/年) | ((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\d{4}|\d{2}) |
時間(小時:分鐘, 24小時制) | ((1|0?)[0-9]|2[0-3]):([0-5][0-9]) |
漢字(字元) | [\u4e00-\u9fa5] |
中文及全形標點符號(字元) | [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee] |
中國大陸固定電話號碼 | (\d{4}-|\d{3}-)?(\d{8}|\d{7}) |
中國大陸手機號碼 | 1\d{10} |
中國大陸郵政編碼 | [1-9]\d{5} |
中國大陸身份證號(15位或18位) | \d{15}(\d\d[0-9xX])? |
非負整數(正整數或零) | \d+ |
正整數 | [0-9]*[1-9][0-9]* |
負整數 | -[0-9]*[1-9][0-9]* |
整數 | -?\d+ |
小數 | (-?\d+)(\.\d+)? |
不包含abc的單詞 | \b((?!abc)\w)+\b |
正則表示式 :是指一個用來描述或者匹配一系列符合某個句法規則的字串的單個字串,簡單說,就是我們寫個模板,然後去匹配字串。
下面我們來看看一些基本的正則表示式的語法:
\:將下個字元標記為一個特殊的字元、一個原義字元、一個向後引用或者一個八進位制轉義符例如“\n”就是匹配一個換行符。
^:匹配開始位置,^(a)這個就匹配開頭必須為a。
$:匹配結束位置,$(a)這個就匹配結尾必須為a。
*:匹配前面的子表示式零次或者多次,如“xu*”這個表示式就能夠匹配“x”和“xuu”。
+:匹配前面的子表示式一次或者多次,如“xu+”這個表示式就能夠匹配“xuu”和“xu”,但不能夠匹配“x”,這個就是和“*”的區別。
?:匹配前面的子表示式零次或者一次,如“xu?”這個表示式就能夠匹配“jian(guo)?”就可以匹配“jian”和“jianguo”。
{n}:n是一個非負數,匹配n次,如“guo{2}”,可以匹配“guoo”,不能匹配“guo”。
{n,}:n是一個非負數,匹配至少n次。
{n, m}:m、n都是非負數,最少匹配n次,最多匹配m次。
(pattern):匹配pattern並獲取匹配結果。
(?:pattern):匹配pattern但不獲取匹配結果。
x|y:匹配x或y,如“(xu|jian)guo”匹配“xuguo”或者“jianguo”。
[xyz]:字元集合,匹配所包含的任意字元。如“[abc]”可以匹配“apple”中的“a”。
[^xyz]:匹配未被包含的字元。
[a-z]:字元範圍,匹配指定範圍內的任意字元。
[^a-z]:匹配指定不在範圍內的任意字元。
\b:匹配一個單詞的邊界,如“guo\b”可以匹配“xujianguo”中的“guo”。
\B:匹配非單詞邊界,如“jian\B”可以匹配“xujianguo”中的“jian”。
\d:匹配一個數字字元,等價於“[0-9]”。
\D:匹配一個非數字字元。
\f:匹配一個換頁符。
\n:匹配一個換行符。
\r:匹配一個回車符。
\s:匹配任何空白字元
其實還有很多語法我就不一一列舉了,先說這麼多先
一.NSString自帶的正則查詢,替換方法
RegexKitLite向標準NSString類增加了很多方法來使用正則表示式,RegexKitLite使用iOS系統自帶的ICU( International Components for Unicode )正則引擎處理正則表示式,所以RegexKitLite使用的正則語法為ICU的語法,使用RegexKitLite需要匯入libicucore.dylib庫。
使用RegexKitLite的方法很簡單,將RegexKitLite.h和RegexKitLite.m加入到工程,然後引入libicucore.dylib庫即可。
RegexKitLite.h RegexKitLite.m
RegexKit Framework與RegexKitLite來自同一體系,但其更復雜和強大。RegexKit Framework不使用iOS系統的ICU正則庫,而是自帶 PCRE( Perl Compatible Regular Expressions )庫, 所以其正則語法是PCRE的語法。
RegexKit Framework功能很強大,其向NSArray,NSData,NSDictionary,NSSet和NSString物件增加了正則表示式的支援。
TRegexKit.framework與 RegexKit Lite 的區別
RegexKit.framework | RegexKit Lite | |
---|---|---|
Regex Library | PCRE | ICU |
Library Included | Yes, built into framework object file. | No, provided by Mac OS X. |
Library Linked As | Statically linked into framework. | Dynamically linked to /usr/lib/libicucore.dylib. |
Compiled Size | Approximately 371KB † per architecture. | Very small, approximately 16KB—20KB ‡ per architecture. |
Style | External, linked to framework. | Compiled directly in to final executable. |
Feature Set | Large, with additions to many classes. | Minimal, NSString only. |
四.常用ICU正則匹配模式
Description | Regex | Examples |
---|---|---|
Integer | [+\-]?[0-9]+ | 123 -42 +23 |
Hex Number | 0[xX][0-9a-fA-F]+ | 0×0 0xdeadbeef0xF3 |
Floating Point | [+\-]?(?:[0-9]*\.[0-9]+|[0-9]+\.) | 123. .123 +.42 |
Floating Point with Exponent | [+\-]?(?:[0-9]*\.[0-9]+|[0-9]+\.)(?:[eE][+\-]?[0-9]+)? | 123. .123 10.0E131.23e-7 |
Comma Separated Number | [0-9]{1,3}(?:,[0-9]{3})* | 42 1,234 1,234,567 |
Comma Separated Number | [0-9]{1,3}(?:,[0-9]{3})*(?:\.[0-9]+)? | 42 1,2341,234,567.89 |
文字檔案 Text Files
Description | Regex |
---|---|
Empty Line | (?m:^$) |
Empty or Whitespace Only Line | (?m-s:^\s*$) |
Strip Leading Whitespace | (?m-s:^\s*(.*?)$) |
Strip Trailing Whitespace | (?m-s:^(.*?)\s*$) |
Strip Leading and Trailing Whitespace | (?m-s:^\s*(.*?)\s*$) |
Quoted String, Can Span Multiple Lines, May Contain \" | "(?:[^"\\]*+|\\.)*" |
Quoted String, Single Line Only, May Contain \" | "(?:[^"\\\r\n]*+|\\[^\r\n])*" |
HTML Comment | (?s:<--.*?-->) |
Perl / Shell Comment | (?m-s:#.*$) |
C, C++, or ObjC Comment | (?m-s://.*$) |
C, C++, or ObjC Comment and Leading Whitespace | (?m-s:\s*//.*$) |
C, C++, or ObjC Comment | (?s:/\*.*?\*/) |
網路與URL相關 Network and URL
Description | Regex |
---|---|
HTTP | \bhttps?://[a-zA-Z0-9\-.]+(?:(?:/[a-zA-Z0-9\-._?,'+\&%$=~*!():@\\]*)+)? |
HTTP | \b(https?)://([a-zA-Z0-9\-.]+)((?:/[a-zA-Z0-9\-._?,'+\&%$=~*!():@\\]*)+)? |
HTTP | \b(https?)://(?:(\S+?)(?::(\S+?))[email protected])?([a-zA-Z0-9\-.]+)(?::(\d+))?((?:/[a-zA-Z0-9\-._?,'+\&%$=~*!():@\\]*)+)? |
\b([a-zA-Z0-9%_.+\-]+)@([a-zA-Z0-9.\-]+?\.[a-zA-Z]{2,6})\b | |
Hostname | \b(?:[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}?[a-zA-Z0-9]\.)+[a-zA-Z]{2,6}\b |
IP | \b(?:\d{1,3}\.){3}\d{1,3}\b |
IP with Optional Netmask | \b((?:\d{1,3}\.){3}\d{1,3})(?:/(\d{1,2}))?\b |
IP or Hostname | \b(?:(?:\d{1,3}\.){3}\d{1,3}|(?:[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}?[a-zA-Z0-9]\.)+[a-zA-Z]{2,6})\b |
五.貪婪匹配與最小匹配
在正則表示式中單獨使用*或+時,預設是匹配儘可能多的資料,即貪婪匹配。
* Match zero <span class="keyword" style="font-weight:bold">or</span> more times. Match <span class="keyword" style="font-weight:bold">as</span> many times <span class="keyword" style="font-weight:bold">as</span> possible.
+ Match one <span class="keyword" style="font-weight:bold">or</span> more times. Match <span class="keyword" style="font-weight:bold">as</span> many times <span class="keyword" style="font-weight:bold">as</span> possible.
比如對 abcdefgabcdefg 使用abc(.*)g進行匹配,則捕獲到到的資料為 defgabcdef。
若只想捕獲到第一個g,即只想得到def,則需要使用最小匹配,在*或+後面加上?,即使用abc(.*?)g進行匹配。
<span class="variable" style="color:#08080;">*?</span> Match zero <span class="keyword" style="font-weight:bold">or</span> more <span class="keyword" style="font-weight:bold">times</span>. Match as few <span class="keyword" style="font-weight:bold">times</span> as possible. +? Match one <span class="keyword" style="font-weight:bold">or</span> more <span class="keyword" style="font-weight:bold">times</span>. Match as few <span class="keyword" style="font-weight:bold">times</span> as possible.
另外,在正則中用(…)包含內容是要捕獲的資料,如果只要用(…)來引用group而不想捕獲則可使用(?:…)。
(…) Capturing parentheses. Range of input that matched the parenthesized subexpression <span class="keyword" style="font-weight:bold">is</span> available after the match. (?:…) Non-capturing parentheses. Groups the included pattern, but does not provide capturing of matching text. Somewhat more efficient than capturing parentheses.
六.正則表示式書寫格式
在書寫正則表示式時,需要將\進行轉義,即寫成兩個\\。
例如 匹配IP地址的正則表示式為 \b(?:\d{1,3}\.){3}\d{1,3}\b,則在實際書寫時則為
<code style="padding:0.5em; font-family:Monaco,Menlo,Consolas,'Courier New',monospace; border:0px; display:block"> NSString <span class="variable" style="color:#08080;">*regex</span> = <span class="variable" style="color:#08080;">@"</span>\\b(?:\\d{<span class="number" style="color:#09999;">1</span>,<span class="number" style="color:#09999;">3</span>}\.)<span class="string" style="color:#dd1144;">{3}</span>\\d{<span class="number" style="color:#09999;">1</span>,<span class="number" style="color:#09999;">3</span>}\\b<span class="string" style="color:#dd1144;">";</span></code>
常用的第三方正則庫:
http://regexkit.sourceforge.net/RegexKitLite/index.html
匹配中文字元的正則表示式: [\u4e00-\u9fa5]
評註:匹配中文還真是個頭疼的事,有了這個表示式就好辦了
匹配雙位元組字元(包括漢字在內):[^\x00-\xff]
評註:可以用來計算字串的長度(一個雙位元組字元長度計2,ASCII字元計1)
匹配空白行的正則表示式:\n\s*\r
評註:可以用來刪除空白行
匹配HTML標記的正則表示式:<(\S*?)[^>]*>.*?</\1>|<.*? />
評註:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的巢狀標記依舊無能為力
匹配首尾空白字元的正則表示式:^\s*|\s*$
評註:可以用來刪除行首行尾的空白字元(包括空格、製表符、換頁符等等),非常有用的表示式
匹配Email地址的正則表示式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
評註:表單驗證時很實用
匹配網址URL的正則表示式:[a-zA-z]+://[^\s]*
評註:網上流傳的版本功能很有限,上面這個基本可以滿足需求
匹配帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評註:表單驗證時很實用
匹配國內電話號碼:\d{3}-\d{8}|\d{4}-\d{7}
評註:匹配形式如 0511-4405222 或 021-87888822
匹配騰訊QQ號:[1-9][0-9]{4,}
評註:騰訊QQ號從10000開始
匹配中國郵政編碼:[1-9]\d{5}(?!\d)
評註:中國郵政編碼為6位數字
匹配身份證:\d{15}|\d{18}
評註:中國的身份證為15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
評註:提取ip地址時有用
匹配特定數字:
^[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)
評註:處理大量資料時有用,具體應用時注意修正
匹配特定字串:
^[A-Za-z]+$ //匹配由26個英文字母組成的字串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字串
^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字串
^\w+$ //匹配由數字、26個英文字母或者下劃線組成的字串
<input onkeypress="return /[\w\u4e00-\u9fa5]/.test(String.fromCharCode(window.event.keyCode))"
onpaste="return !/[^\w\u4e00-\u9fa5]/g.test(window.clipboardData.getData('Text'))"
ondragenter="return false"/>
再貼上一些別人寫的。
1.只能輸入數字和英文的:
<input onkeyup="value=value.replace(/[\W]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text1" NAME="Text1">
2.只能輸入數字的:
<input onkeyup="value=value.replace(/[^\d]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" ID="Text2" NAME="Text2">
3.只能輸入全形的:
<input onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" ID="Text3" NAME="Text3">
4.只能輸入漢字的:
<input onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" ID="Text4" NAME="Text4">
5.郵件地址驗證:
var regu = "^(([0-9a-zA-Z]+)|([0-9a-zA-Z]+[_.0-9a-zA-Z-]*[0-9a-zA-Z]+))@([a-zA-Z0-9-]+[.])+([a-zA-Z]{2}|net|NET|com|COM|gov|GOV|mil|MIL|org|ORG|edu|EDU|int|INT)$"
var re = new RegExp(regu);
if (s.search(re) != -1) {
return true;
} else {
window.alert ("請輸入有效合法的E-mail地址 !")
return false;
}
6.身份證:
"^\\d{17}(\\d|x)$"
7.17種正則表示式
"^\\d+$" //非負整數(正整數 + 0)
"^[0-9]*[1-9][0-9]*$" //正整數
"^((-\\d+)|(0+))$" //非正整數(負整數 + 0)
"^-[0-9]*[1-9][0-9]*$" //負整數
"^-?\\d+$" //整數
"^\\d+(\\.\\d+)?$" //非負浮點數(正浮點數 + 0)
"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮點數
"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$" //非正浮點數(負浮點數 + 0)
"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //負浮點數
"^(-?\\d+)(\\.\\d+)?$" //浮點數
"^[A-Za-z]+$" //由26個英文字母組成的字串
"^[A-Z]+$" //由26個英文字母的大寫組成的字串
"^[a-z]+$" //由26個英文字母的小寫組成的字串
"^[A-Za-z0-9]+$" //由數字和26個英文字母組成的字串
"^\\w+$" //由數字、26個英文字母或者下劃線組成的字串
"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$" //email地址
"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$" //url
=============================================
1.取消按鈕按下時的虛線框
在input裡新增屬性值 hideFocus 或者 HideFocus=true
2.只讀文字框內容
在input裡新增屬性值 readonly
3.防止退後清空的TEXT文件(可把style內容做做為類引用)
<INPUT style=behavior:url(#default#savehistory); type=text id=oPersistInput>
4.ENTER鍵可以讓游標移到下一個輸入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9" >
5.只能為中文(有閃動)
<input onkeyup="value="/value.replace(/[" -~]/g,’’)" onkeydown="if(event.keyCode==13)event.keyCode=9">
6.只能為數字(有閃動)
<input onkeyup="value="/value.replace(/["^\d] /g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))">
7.只能為數字(無閃動)
<input ime- mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9" onKeyPress="if ((event.keyCode<48 || event.keyCode>57)) event.returnValue=false">
8.只能輸入英文和數字(有閃動)
<input onkeyup="value="/value.replace(/[\W] /g,"’’)" onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))">
9.遮蔽輸入法
<input type="text" name="url" ime-mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9">
10. 只能輸入 數字,小數點,減號(-) 字元(無閃動)
<input onKeyPress="if (event.keyCode!=46 && amp; event.keyCode!=45 && (event.keyCode<48 || event.keyCode>57)) event.returnValue=false">
11. 只能輸入兩位小數,三位小數(有閃動)
<input maxlength=9 onkeyup="if(value.match(/^\d{3}$/))value=" /value.replace(value,parseInt(value/10))" ;value="/value.replace(/\.\d*\./g,’."’)" onKeyPress="if((event.keyCode<48 || event.keyCode>57) && event.keyCode!=46 && event.keyCode!=45 || value.match(/^\d{3}$/) || /\.\d{3}$/.test(value)) {event.returnValue=false}" id=text_kfxe name=text_kfxe>
javascript正則表示式使用詳解
簡介
簡單的說,正則表示式是一種可以用於模式匹配和替換的強有力的工具。其作用如下:
測試字串的某個模式。例如,可以對一個輸入字串進行測試,看在該字串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為資料有效性驗證。
替換文字。可以在文件中使用一個正則表示式來標識特定文字,然後可以全部將其刪除,或者替換為別的文字。
根據模式匹配從字串中提取一個子字串。可以用來在文字或輸入欄位中查詢特定文字。
基本語法
在對正則表示式的功能和作用有了初步的瞭解之後,我們就來具體看一下正則表示式的語法格式。
正則表示式的形式一般如下:
/love/ 其中位於“/”定界符之間的部分就是將要在目標物件中進行匹配的模式。使用者只要把希望查詢匹配物件的模式內容放入“/”定界符之間 即可。為了能夠使使用者更加靈活的定製模式內容,正則表示式提供了專門的“元字元”。所謂元字元就是指那些在正則表示式中具有特殊意義的專用字元,可以用來 規定其前導字元(即位於元字元前面的字元)在目標物件中的出現模式。
較為常用的元字元包括: “+”, “*”,以及 “?”。
“+”元字元規定其前導字元必須在目標物件中連續出現一次或多次。
“*”元字元規定其前導字元必須在目標物件中出現零次或連續多次。
“?”元字元規定其前導物件必須在目標物件中連續出現零次或一次。
下面,就讓我們來看一下正則表示式元字元的具體應用。
/fo+/ 因為上述正則表示式中包含“+”元字元,表示可以與目標物件中的 “fool”, “fo”, 或者 “football”等在字母f後面連續出現一個或多個字母o的字串相匹配。
/eg*/ 因為上述正則表示式中包含“*”元字元,表示可以與目標物件中的 “easy”, “ego”, 或者 “egg”等在字母e後面連續出現零個或多個字母g的字串相匹配。
/Wil?/ 因為上述正則表示式中包含“?”元字元,表示可以與目標物件中的 “Win”, 或者“Wilson”,等在字母i後面連續出現零個或一個字母l的字串相匹配。
有時候不知道要匹配多少字元。為了能適應這種不確定性,正則表示式支援限定符的概念。這些限定符可以指定正則表示式的一個給定元件必須要出現多少次才能滿足匹配。
{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?'。請注意在逗號和兩個數之間不能有空格。
除了元字元之外,使用者還可以精確指定模式在匹配物件中出現的頻率。例如,/jim {2,6}/ 上述正則表示式規定字元m可以在匹配物件中連續出現2-6次,因此,上述正則表示式可以同jimmy或jimmmmmy等字串相匹配。
在對如何使用正則表示式有了初步瞭解之後,我們來看一下其它幾個重要的元字元的使用方式。
- \s:用於匹配單個空格符,包括tab鍵和換行符;
- \S:用於匹配除單個空格符之外的所有字元;
- \d:用於匹配從 0 到 9 的數字;
- \w:用於匹配字母,數字或下劃線字元;
- \W:用於匹配所有與\w不匹配的字元;
- . :用於匹配除換行符之外的所有字元。
下面,我們就通過例項看一下如何在正則表示式中使用上述元字元。
/\s+/ 上述正則表示式可以用於匹配目標物件中的一個或多個空格字元。
/\d000/ 如果我們手中有一份複雜的財務報表,那麼我們可以通過上述正則表示式輕而易舉的查詢到所有總額達千元的款項。
除了我們以上所介紹的元字元之外,正則表示式中還具有另外一種較為獨特的專用字元,即定位符。定位符用於規定匹配模式在目標物件中的出現位置。 較為常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。 程式碼
- “^”定位符規定匹配模式必須出現在目標字串的開頭
- “$”定位符規定匹配模式必須出現在目標物件的結尾
- “\b”定位符規定匹配模式必須出現在目標字串的開頭或結尾的兩個邊界之一
- “\B”定位符則規定匹配物件必須位於目標字串的開頭和結尾兩個邊界之內,
- 即匹配物件既不能作為目標字串的開頭,也不能作為目標字串的結尾。
為了能夠方便使用者更加靈活的設定匹配模式,正則表示式允許使用者在匹配模式中指定某一個範圍而不侷限於具體的字元。例如: 程式碼
- /[A-Z]/ 上述正則表示式將會與從A到Z範圍內任何一個大寫字母相匹配。
- /[a-z]/ 上述正則表示式將會與從a到z範圍內任何一個小寫字母相匹配。
- /[ 0 - 9 ]/ 上述正則表示式將會與從 0 到 9 範圍內任何一個數字相匹配。
- /([a-z][A-Z][ 0 - 9 ])+/ 上述正則表示式將會與任何由字母和數字組成的字串,如 “aB0” 等相匹配。
如果我們希望在正則表示式中實現類似程式設計邏輯中的“或”運算,在多個不同的模式中任選一個進行匹配的話,可以使用管道符 “|”。例如:/to|too|2/ 上述正則表示式將會與目標物件中的 “to”, “too”, 或 “2” 相匹配。
正則表示式中還有一個較為常用的運算子,即否定符 “[^]”。與我們前文所介紹的定位符 “^” 不同,否定符 “[^]”規定目標物件中不能存在模式中所規定的字串。例如:/[^A-C]/ 上述字串將會與目標物件中除A,B,和C之外的任何字元相匹配。一般 來說,當“^”出現在 “[]”內時就被視做否定運算子;而當“^”位於“[]”之外,或沒有“[]”時,則應當被視做定位符。
最後,當用戶需要在正則表示式的模式中加入元字元,並查詢其匹配物件時,可以使用轉義符“\”。例如:/Th\*/ 上述正則表示式將會與目標物件中的“Th*”而非“The”等相匹配。
在構造正則表示式之後,就可以象數學表示式一樣來求值,也就是說,可以從左至右並按照一個優先順序順序來求值。優先順序如下: 程式碼
- 1 .\ 轉義符
- 2 .(), (?:), (?=), [] 圓括號和方括號
- 3 .*, +, ?, {n}, {n,}, {n,m} 限定符
- 4 .^, $, \anymetacharacter 位置和順序
- 5 .|“或”操作
使用例項
在JavaScript 1.2中帶有一個功能強大的RegExp()物件,可以用來進行正則表示式的匹配操作。其中的test()方法可以檢驗目標物件中是否包含匹配模式,並相應的返回true或false。
我們可以使用JavaScript編寫以下指令碼,驗證使用者輸入的郵件地址的有效性。
- < html >
- < head >
- < script language = "Javascript1.2" >
- <!-- start hiding
- function verifyAddress(obj)
- {
- var email = obj .email.value;
- var pattern =
- /^([a-zA-Z0-9_-])[email protected]([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
- flag = pattern .test(email);
- if(flag)
- {
- alert(“Your email address is correct!”);
- return true;
- }
- else
- {
- alert(“Please try again!”);
- return false;
- }
- }
- // stop hiding -- >
- </ script >
- </ head >
- < body >
- < form onSubmit = "return verifyAddress(this);" >
- < input name = "email" type = "text" >
- < input type = "submit" >
- </ form >
- </ body >
- </ html >
正則表示式物件
本物件包含正則表示式模式以及表明如何應用模式的標誌。
- 語法 1 re = /pattern/[flags]
- 語法 2 re = new RegExp( "pattern" ,[ "flags" ])
re
必選項。將要賦值為正則表示式模式的變數名。
Pattern
必選項。要使用的正則表示式模式。如果使用語法 1,用 "/" 字元分隔模式。如果用語法 2,用引號將模式引起來。
Flags
可選項。如果使用語法 2 要用引號將 flag 引起來。標誌可以組合使用,可用的有:
- g (全文查找出現的所有 pattern)
- i (忽略大小寫)
- m (多行查詢)
示例
下面的示例建立一個包含正則表示式模式及相關標誌的物件(re),向您演示正則表示式物件的用法。在本例中,作為結果的正則表示式物件又用於 match 方法中:
- function MatchDemo()
- {
- var r, re; // 宣告變數。
- var s = "The rain in Spain falls mainly in the plain" ;
- re = new RegExp( "ain" , "g" ); // 建立正則表示式物件。
- r = s.match(re); // 在字串 s 中查詢匹配。
- return (r);
- }
返回值: ain,ain,ain,ain\\
屬性 lastIndex 屬性 | source 屬性\\
方法 compile 方法 | exec 方法 | test 方法\\
要求 版本 3\\
請參閱 RegExp 物件 | 正則表示式語法 | String 物件\\
exec 方法
用正則表示式模式在字串中執行查詢,並返回包含該查詢結果的一個數組。
rgExp.exec(str)
引數
rgExp
必選項。包含正則表示式模式和可用標誌的正則表示式物件。
str
必選項。要在其中執行查詢的 String 物件或字串文字。
說明\\
如果 exec 方法沒有找到匹配,則它返回 null。如果它找到匹配,則 exec 方法返回一個數組,並且更新全域性 RegExp 物件的屬性,以反映匹配結果。陣列的0元素包含了完整的匹配,而第1到n元素中包含的是匹配中出現的任意一個子匹配。這相當於沒有設定全域性標誌 (g) 的 match 方法。
如果為正則表示式設定了全域性標誌,exec 從以 lastIndex 的值指示的位置開始查詢。如果沒有設定全域性標誌,exec 忽略 lastIndex 的值,從字串的起始位置開始搜尋。
exec 方法返回的陣列有三個屬性,分別是 input、index 和 lastIndex。Input 屬性包含了整個被查詢的字串。Index 屬性中包含了整個被查詢字串中被匹配的子字串的位置。LastIndex 屬性中包含了匹配中最後一個字元的下一個位置。
示例\\
下面的例子舉例說明了 exec 方法的用法:
- function RegExpTest()
- {
- var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())
- if (ver >= 5.5 ){ // 測試 JScript 的版本。
- var src = "The rain in Spain falls mainly in the plain." ;
- var re = /\w+/g; // 建立正則表示式模式。
- var arr;
- while ((arr = re.exec(src)) != null )
- document.write(arr.index + "-" + arr.lastIndex + arr + "\t" );
- }
- else {
- alert( "請使用 JScript 的更新版本" );
- }
- }
返回值:0-3The 4-8rain 9-11in 12-17Spain 18-23falls 24-30mainly 31-33in 34-37the 38-43plain
test 方法\\
返回一個 Boolean 值,它指出在被查詢的字串中是否存在模式。
rgexp.test(str)
引數\\
rgexp
必選項。包含正則表示式模式或可用標誌的正則表示式物件。
str
必選項。要在其上測試查詢的字串。
說明
test 方法檢查在字串中是否存在一個模式,如果存在則返回 true,否則就返回 false。
全域性 RegExp 物件的屬性不由 test 方法來修改。
示例
下面的例子舉例說明了 test 方法的用法:
- function TestDemo(re, s)
- {
- var s1; // 宣告變數。
- // 檢查字串是否存在正則表示式。
- if (re.test(s)) // 測試是否存在。
- s1 = " contains " ; // s 包含模式。
- else
- s1 = " does not contain " ; // s 不包含模式。
- return ( "'" + s + "'" + s1 + "'" + re.source + "'" ); // 返回字串。
- }
函式呼叫:document.write (TestDemo(/ain+/ ,"The rain in Spain falls mainly in the plain."));
返回值:'The rain in Spain falls mainly in the plain.' contains 'ain+'
match 方法
使用正則表示式模式對字串執行查詢,並將包含查詢的結果作為陣列返回。\\
stringObj.match(rgExp)
引數\\
stringObj
必選項。對其進行查詢的 String 物件或字串文字。
rgExp
必選項。為包含正則表示式模式和可用標誌的正則表示式物件。也可以是包含正則表示式模式和可用標誌的變數名或字串文字。
說明\\
如果 match 方法沒有找到匹配,返回 null。如果找到匹配返回一個數組並且更新全域性 RegExp 物件的屬性以反映匹配結果。
match 方法返回的陣列有三個屬性:input、index 和 lastIndex。Input 屬性包含整個的被查詢字串。Index 屬性包含了在整個被查詢字串中匹配的子字串的位置。LastIndex 屬性包含了最後一次匹配中最後一個字元的下一個位置。
如果沒有設定全域性標誌 (g),陣列的 0 元素包含整個匹配,而第 1 到 n 元素包含了匹配中曾出現過的任一個子匹配。這相當於沒有設定全域性標誌的 exec 方法。如果設定了全域性標誌,元素 0 到 n 中包含所有匹配。
示例\\
下面的示例演示了match 方法的用法:
- function MatchDemo()
- {
- var r, re; // 宣告變數。
- var s = "The rain in Spain falls mainly in the plain" ;
- re = /ain/i; // 建立正則表示式模式。
- r = s.match(re); // 嘗試匹配搜尋字串。
- return (r);