「正硎痉ā够颉刚健梗Regular expressions)是在 UNIX 世界中l展出淼淖执记桑浠靖拍钍怯靡惶缀危ǖδ大)的符肀ψ执K可Ψ媳l件的字串M行修改或其他\算。事上,UNIX 的S多w或指令都支援正硎痉ǎ grep、sed、awk、ed、vi、emacs 等。(@些|西大概只有像我@拥 LKK 才谩#┯绕涫 Perl,更是⒄硎痉òl]的淋漓M致。
Netscape 及 IE 在第四版後都支援 JavaScript 的正硎痉ǎem用於表钨Y料的Cc修改。事上,JavaScript 的正硎痉ê Perl 乎一模一樱虼耍诒菊W到的正硎痉ǎ部梢酝耆m用於 Perl。(一~沙裕直太棒了!)
JavaScript 的正剑Regular expressions)是一冉ǖ奈锛浣函示(Construction functoin) RegExp,典型用法如下:
re = new RegExp("pattern", "flag")
上述用法也可以成:
re = /pattern/flag
其中,pattern 代表以正硎痉盹@示的字串,flag t是比Φ姆绞健flag 的值可能有三N,分e解如下:
g:全域比ΓGlobal match)
i:忽略大小(Ignore case)
gi:全域比K忽略大小
e例碚f,我的身份C字的格式是由一英文字母加上九底纸M合而成,如果我要求使用者入身份C字,就可以使用 JavaScript 的正硎痉眚C其格式的正_性。例如,我可用下列表硪笫褂谜咻入身份C字:
身份C字:(第一英文字母需大)
在上例中,我利用 onBlur 事件磉M行正降谋ΓQ句f,使用者填完Y料,要x_此谖坏r候,JavaScript 即y知 onBlur 事件,K呼叫函 checkID() μ钊氲馁Y料M行C。(欲y其效果,只需h除谖鹊娜我字元,再到谖煌恻c一下,就可以看到警告窗了。)相P原始a如下:
<SCRIPT>
function checkID(formElement) {
re = /^[A-Z]\d{9}$/;
if (!re.test(formElement.value))
alert("你的身份Ca格式不Γ");
}
</SCRIPT>
<FORM>身份C字:<INPUT onblur=checkID(this) value=A000000000>(第一英文字母需大) </FORM>
在上述原始a中,/^[A-Z]\d{9}$/ 就是一正剑[A-Z] 代表由 A 至 Z 的所有可能英文字母,\d 代表由 0 至 9 的的孔郑ㄊ上也可以成 [0-9]),{9} t代表需要有九的孔郑^ 代表字串_始位置,$ 代表字串Y束位置,因此 /^[A-Z]\d{9}$/ 就代表可以比ι矸葑C字的正健formElement.value 代表使用者入的字串,re.test() t骰 true 或 false,代表比κ欠癯晒ΑH粢幌薅ㄊ谴英文字母,只需⒄礁某 /^[a-zA-Z]\d{9}$/g 就可以了!(注意:若不加入 ^ 和 $,那N /[A-Z]\d{9}/ 就Φ狡渌缓戏ǖ纳矸葑C字,例如 AGF123456789 或是 F1234567890 等。因此,加入 ^ 和 $ 可保C比φ_的字串一定是由由一大英文字母加上九底炙成。)
事上,身份C字本身就有仍诘木at,@些t和使用者的性e有P,因此若要F^完整的表悟C,就必幂^完整的身份Cat。
另一蔚睦樱且笫褂谜咻入信用卡a,@是一M16底值奶a,例如:
信用卡a:(格式:xxxx-xxxx-xxxx-xxxx)
onBlur l生r,Q句f,JavaScript 艚泻 checkCreditCard( ) μ钊氲馁Y料M行C。相P原始a如下:
<SCRIPT>
function checkCreditCard(control) {
re = /^\d{4}-\d{4}-\d{4}-\d{4}$/;
if (!re.test(control.value))
alert("你的信用卡a不符合「xxxx-xxxx-xxxx-xxxx」的格式!");
}
</SCRIPT>
<FORM>信用卡a:<INPUT onblur=checkCreditCard(this) value=xxxx-xxxx-xxxx-xxxx>(格式:xxxx-xxxx-xxxx-xxxx) </FORM>
在上例中,很@然地,/^\d{4}-\d{4}-\d{4}-\d{4}$/ 就代表正_的信用卡格式。
下一例子,t是用正硎痉眚C使用者的英文名字,例如:
你的英文全名:(格式:First Last 或 First Middle Last)
onBlur l生r,Q句f,JavaScript 艚泻 checkEnglishName( ) μ钊氲馁Y料M行C。相P原始a如下:
<SCRIPT>
function checkEnglishName(control) {
re1 = /^[A-Za-z\-]+\s+[A-Za-z\-]+$/;
re2 = /^[A-Za-z\-]+\s+[A-Za-z\-]+\s+[A-Za-z\-]+$/;
if (!re1.test(control.value) && !re2.test(control.value))
alert("你的英文名字格式不Γ");
}
</SCRIPT>
<FORM>你的英文全名:<INPUT onblur=checkEnglishName(this)>(格式:First Last 或 First Middle Last) </FORM>
正轿锛姆椒闪斜砣缦拢
正轿锛姆椒 功能
re.compile(pattern, flag) φ轿锛 re M行g,以增加比λ俣
re.exec(string) 或 re(string) 比φ剑K骰仃列
re.test(string) 比φ剑K骰乇Y果(成功或失。
在上述例中,我只用到了正轿锛 test() 方法砼啾κ欠癯晒Γ渌椒卺嵝蛘鹿提到。
在M行表钨Y料C之前,我冗M行表钨Y料修改,例如拿掉不必要的空格、英文字母大小DQ等,@些工作也可以由字串的 replace() 方法或正降 exec() 方法磉_成,@是我下一的主}。
在下列的表格中,我使用蔚墓例φ降米鲚^完整的f明:
正 f明及例 比Σ怀闪⒅执
/a/ 含字母 "a" 的字串,例如:"ab", "bac", "cba" "xyz"
/a./ 含字母 "a" 以及其後任一字元的字串,例如:"ab", "bac" "a", "ba"
/^xy/ 以 "xy" _始的字串,例如:"xyz", "xyab" "axy", "bxy"
/xy$/ 以 "xy" Y尾的字串,例如:"axy", "abxy" "xya", "xyb"
[13579] 包含 "1" 或 "3" 或 "5" 或 "7" 或 "9" 的字串,例如:"a3b", "1xy" "y2k"
[0-9] 含底种执 不含底种执
[a-z0-9] 含底只蛐字母之字串 不含底旨靶字母之字串
[a-zA-Z0-9] 含底只蜃帜钢执 不含底旨白帜钢执
b[aeiou]t "bat", "bet", "bit", "bot", "but" "bxt", "bzt"
[^0-9] 不含底种执 含底种执
[^aeiouAEIOU] 不含母音之字串 含母音之字串
[^\^] 不含 "^" 之字串,例如:"xyz", "abc" "xy^", "a^bc"
注意在上表中,"^" 在l斜中,代表一字串的_始位置,因此 /^xy/ 代表以 "xy" _始的字串。同理,"$" 在l斜中,代表一字串的Y束位置,因此 /xy$/ 代表以 "xy" Y束的字串。但是如果 "^" 放在方括弧中,就代表「否定」,因此 [^aeiouAEIOU] 代表不含母音之字串。
有些正1挥玫剑虼艘驯欢x樘囟ㄗ衷@些字元可列表f明如下:
正硎痉ǖ奶囟ㄗ衷 f明 等效的正硎痉
\d 底 [0-9]
\D 非底 [^0-9]
\w 底帧⒆帜浮⒌拙 [a-zA-Z0-9_]
\W 非 \w [^a-zA-Z0-9_]
\s 空白字元 [\r\t\n\f]
\S 非空白字元 [^\r\t\n\f]
此外,我可定x字元的重}次担缦拢
正硎痉 f明
/a?/ 零或一 a
/a+/ 一或多 a
/a*/ 零或多 a
/a{4}/ 四 a
/a{5,10}/ 五至十 a
/a{5,}/ 至少五 a
/a{,3} 至多三 a
/a.{5}b/ a 和 b中gA五(非Q行)字元
各位F在已可以慢慢w秸硎臼降耐α耍±猛拥姆椒ǎ可以Ω魇礁拥谋屋入M行C,⒖枷率龉例。
注意事
以 RegExp(pattern, flag) 的方式斫⒄轿锛r,若 pattern 包含以反斜_^的特殊字元(例如 \d、\w、\s 等)r,我必再加上一反斜肀A羝涮厥庖饬x。例如:
re = /\d+\s\w+/g
以 RegExp 橹鞯牡刃П硎痉椋
re = new RegExp("\\d+\\s\\w+", "g");