版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
JavaScript、Java正則表達(dá)式詳解什么是正則表達(dá)式?正則表達(dá)式(Regular
Expression)就是用某種模式去匹配一類字符串的公式。如你要在一篇文章中查找第一個(gè)字是“羅”最后一個(gè)字是“浩”的三個(gè)字的姓名,即“羅*浩”;那么“羅*浩”就是公式,也稱作模式(Pattern),這篇文章就是要匹配的串(或叫文本text)。再如,你要檢查輸入的一個(gè)字符串是否是126郵箱的格式,你得制定一個(gè)規(guī)則去查檢,這種規(guī)則就是正則表達(dá)式。從入門開始我們就從上面提到的一個(gè)例子開始:檢查一個(gè)字符串是否符合126郵箱的格式。我們從網(wǎng)易的郵箱注冊(cè)頁面可以看到126郵箱的用戶名需要符合以下的格式:6~18個(gè)字符,可使用字母、數(shù)字、下劃線,需以字母開頭。我們可以定義一個(gè)模式:^[a-zA-Z]\w{5,17}@126.com
這個(gè)模式可以這樣理解:[a-zA-Z]:任何一個(gè)a到z或A到Z的英文字母^:
表示以什么開頭,則^[a-zA-Z]表示以字母開頭\w:
單詞字符[a-zA-Z_0-9],即a-z或A-Z或0-9或_中的任何一個(gè)字符{5,17}:
表示出現(xiàn)5到17次(至少5次,不超過17次),則\w{5,17}表示5~17個(gè)字符。
因?yàn)檫€有一個(gè)以非數(shù)字字母開頭的字符,所以^[a-zA-Z]\w{5,17}表示:“6~18個(gè)字符,可使用字母、數(shù)字、下劃線,需以字母開頭”@126.com:表示符合以上規(guī)則的用戶名后跟上@126.com字符串,即組成一個(gè)郵箱地址。
“^[a-zA-Z]\w{5,17}@126.com”就是我們所說的正則表達(dá)式,用Java的簡單實(shí)現(xiàn)如下:[javascript]
\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?String
regex
=
"^[a-zA-Z]\\w{5,17}@126\\.com";
//定義匹配的規(guī)則:正則表達(dá)式
//說明:126.com中的.需要轉(zhuǎn)義\\.
String
text
=
"ZhanSan@126fcom";
//要檢查的字符串
boolean
isMatched
=
text.matches(regex);
//判斷text是否符合規(guī)則regex
System.out.println(isMatched);
正則表達(dá)式常用符號(hào)上面一個(gè)示例中用到的“^”、“\w”、“{5,17}”等都是正則表達(dá)式中的常用符號(hào),這些符號(hào)在正則表達(dá)式中都有特殊的含意。下面這個(gè)表格是Java中的正則表達(dá)式常用符號(hào)的含意(只抽取了其常用的部分進(jìn)行說明,就這些部分其實(shí)可以解決關(guān)于正則表達(dá)式的絕大多數(shù)的問題了)。模式匹配的內(nèi)容(含意)
字符類[abc]a、b
或
c(簡單類)[^abc]任何字符,除了
a、b
或
c(否定)[a-zA-Z]a
到
z
或
A
到
Z,兩頭的字母包括在內(nèi)(范圍)[a-d[m-p]]a
到
d
或
m
到
p:[a-dm-p](并集)[a-z&&[def]]d、e
或
f(交集)[a-z&&[^bc]]a
到
z,除了
b
和
c:[ad-z](減去)[a-z&&[^m-p]]a
到
z,而非
m
到
p:[a-lq-z](減去)
預(yù)定義字符類.任何字符(與行結(jié)束符可能匹配也可能不匹配)\d數(shù)字:[0-9]\D非數(shù)字:
[^0-9]\s空白字符:[
\t\n\x0B\f\r]\S非空白字符:[^\s]\w單詞字符:[a-zA-Z_0-9]\W非單詞字符:[^\w]
邊界匹配器^行的開頭$行的結(jié)尾\b單詞邊界\B非單詞邊界\A輸入的開頭\G上一個(gè)匹配的結(jié)尾\Z輸入的結(jié)尾,僅用于最后的結(jié)束符(如果有的話)\z輸入的結(jié)尾
數(shù)量詞(Greedy策略)X?X,一次或一次也沒有X*X,零次或多次X+X,一次或多次X{n}X,恰好
n
次X{n,}X,至少
n
次X{n,m}X,至少
n
次,但是不超過
m
次
邏輯運(yùn)算符XYX
后跟
YX|YX
或
Y(X)X,作為捕獲組參考文檔:Class
Pattern
這些常用的符號(hào)在各種編程語言的正則表達(dá)式中含意基本相同(因?yàn)檎齽t表達(dá)式的思想是相同的),所以都可以用來參數(shù)。但不同的語言可能會(huì)有一些細(xì)小的差別,如果要針對(duì)各種編程語言,想有更精確和權(quán)威的說明,可參考其官方文檔:C++(VS2013編譯器):/zh-cn/library/bb982727.aspx#grammarsummaryJava:
/javase/7/docs/api/java/util/regex/Pattern.htmlJavaScript:
/jsref/jsref_obj_regexp.asp
正則表達(dá)式的使用下面從常見的需求出發(fā)講述C++、Java和JavaScript中正則表達(dá)式的使用C++中的正則表達(dá)式C++中正則表達(dá)式主要有三種實(shí)現(xiàn)方式:C語言的實(shí)現(xiàn)方式(C
regex),C++標(biāo)準(zhǔn)庫的實(shí)現(xiàn)(C++
regex),Boost庫的實(shí)現(xiàn)(boost
regex)。C
regex的方式是一種面向過程的編程方式,使用起來不太方便;C++
regex的方式因?yàn)槭菢?biāo)準(zhǔn)庫的一部分,所以可以直接使用(好像Linux平臺(tái)下不支持),但C++
regex非常難用,語法要求比較嚴(yán)格,而且好多默認(rèn)的選項(xiàng)和我們正常的想法不一樣;Boost是一個(gè)開源的第三方庫,這個(gè)庫非常優(yōu)秀,廣泛應(yīng)用于C++的項(xiàng)目開發(fā)中,boost
regex非常靈活好用,C++開發(fā)時(shí)是大家推崇的一種方式。關(guān)于boost
regex的用法,在后繼的文章將會(huì)進(jìn)一步介紹,現(xiàn)在以C++
regex的方式列舉一個(gè)使用樣例。1.驗(yàn)證ip地址[cpp]
\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?#include
<regex>
#include
<iostream>
#include
<string>
bool
IsIpV4Address(const
std::string&
strIp)
{
//驗(yàn)證IP地址的模式,這里"\."中的"\"是轉(zhuǎn)義字符,表示這是一個(gè).
const
std::regex
pattern("(\\d{1,3}){1}\.(\\d{1,3}){1}\.(\\d{1,3}){1}\.(\\d{1,3}){1}");
//匹配驗(yàn)證
return
std::regex_match(strIp,
pattern);
}
int
main()
{
std::string
strIp1
=
"";//
std::string
strIp2
=
"192.168.255";
std::cout
<<
strIp1
<<
"
:
"
<<
(IsIpV4Address(strIp1)
?
"valid"
:
"invalid")
<<
std::endl;
std::cout
<<
strIp2
<<
"
:
"
<<
(IsIpV4Address(strIp2)
?
"valid"
:
"invalid")
<<
std::endl;
return
0;
}
Java中的正則表達(dá)式1.驗(yàn)證一個(gè)字符串是否為URL[java]
\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?public
static
boolean
isUrl(String
text)
{
String
regex
=
"^http://([\\w-]+.)+[\\w-]+(/[\\w-./?%&=#]*)?$";
return
text.matches(regex);
}
2.判斷一個(gè)文本中有多少個(gè)URL,并將所有的URL加上超鏈接.如以下文本:C++(VS2013編譯器):/zh-cn/library/bb982727.aspx#grammarsummaryJava:
/javase/7/docs/api/java/util/regex/Pattern.htmlJavaScript:
/jsref/jsref_obj_regexp.asp添加鏈接后變成:C++(VS2013編譯器):<a
href=”/zh-cn/library/bb982727.aspx#grammarsummary”>/zh-cn/library/bb982727.aspx#grammarsummary</a>Java:
<a
href=”/javase/7/docs/api/java/util/regex/Pattern.html”>/javase/7/docs/api/java/util/regex/Pattern.html</a>JavaScript:
<a
href=”/jsref/jsref_obj_regexp.asp”>/jsref/jsref_obj_regexp.asp</a>
[java]
\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?/**
*
給一個(gè)字符串添加鏈接
*
@param
text
要添加鏈接的字符串
*
@param
url
鏈接的URL
*
@return
添加鏈接后的字符串
*/
public
static
String
AddHref(String
text,
String
url)
{
return
"<a
href=\""
+
url
+
"\">"
+
text
+
"</a>";
}
/**
*
查找文本中的URL字符串,并將其添加鏈接
*
@param
text
需要查找的文本
*
@return
添加鏈接后的文本
*/
public
static
String
AddLinkToText(String
text)
{
Pattern
pattern
=
Ppile("http://([\\w-]+.)+[\\w-]+(/[\\w-./?%&=#]*)?");
Matcher
matcher
=
pattern.matcher(text);
StringBuffer
sb
=
new
StringBuffer();
//定義一個(gè)字符緩沖區(qū),用于保存新的文本
while
(matcher.find())
{
String
matchedSubStr
=
matcher.group();
//提取出查找到的子串
matcher.appendReplacement(sb,
AddHref(matchedSubStr,
matchedSubStr));
//將找到的子串添加鏈接后塞到字符緩沖區(qū)內(nèi)
}
matcher.appendTail(sb);
return
sb.toString();
}
JavaScript中的正則表達(dá)式JavaScript中的正則表達(dá)式是通過RegExp對(duì)象實(shí)現(xiàn)的。RegExp對(duì)象的創(chuàng)建有三種方式:精簡方式:/pattern/attributesnew方式:new
RegExp(pattern,
attributes);函數(shù)調(diào)用的方式:RegExp(pattern,
attributes);
參數(shù)pattern可以是一個(gè)模式串,也可以是一個(gè)RegExp對(duì)象,如果pattern本身就是RegExp的對(duì)象,則attributes參數(shù)將不起作用(新創(chuàng)建的對(duì)象的必發(fā)與pattern對(duì)象相同。),需要省略,如果不省略會(huì)拋TypeError
異常。
參數(shù)attributes有三種屬性"g"、"i"
和
"m",分別用于指定全局匹配、區(qū)分大小寫的匹配和多行匹配。
RegExp主要有三個(gè)方法:compile編譯正則表達(dá)式,可用于改變和重新編譯正則表達(dá)式。exec檢索字符串中指定的值。返回找到的值,并確定其位置。test檢索字符串中是否有指定的值。返回
true
或
false。
1.驗(yàn)證字符串是否為數(shù)字[javascript]
\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?<script
type="text/javascript">
function
isNumber(text)
{
var
pattern
=
new
RegExp("^\\d*$");
return
pattern.test(text);
}
var
value1
=
"1234";
document.write(value1
+
"
is
Numed:"
+
isNumber(value1));
</script>
2.郵箱格式:[javascript]
\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?<script
type="text/javascript">
function
isEmail(text)
{
var
reg
=
/^([\w-.])+@([\w-])+((\.[\w-]{2,3}){1,2})$/;
return
reg.test(text);
}
var
value2
=
"Zhang.San@163.com";
document.write(value2
+
"
is
Email:"
+
isEmail(value2));
</script>
3.將一個(gè)文本中的所有郵箱地址和在文本中的位置打印到頁面[javascript]
\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?<script
type="text/javascript">
function
PrintEmail(text)
{
//匹配的模式
var
reg
=
RegExp("([\\w-.])+@([\\w-])+((\.[\\w-]{2,3}){1,2})",
"g");
var
result;
//保存結(jié)果
while
((result
=
reg.exec(text))
!=
null)
{
document.write(result[0]
+
"<br/>"
+
result.index);
document.write("<br/><br/>");
}
}
var
text
=
"張三
Zhang.San@163.com;
李四
Li_si@126.com;王五
WangWu@"
;
PrintEmail(text);
</script>
應(yīng)用場景數(shù)據(jù)驗(yàn)證:例如,可以檢查輸入的字符串,看其是否為電話號(hào)碼格式,或是否為郵箱格式。
這在網(wǎng)頁的表單輸入中經(jīng)常用到。查找子串:可以查找文檔內(nèi)(或一個(gè)字符串內(nèi))符合指定模式的子串。替換文本:可以使用正則表達(dá)式來識(shí)別文檔中的特定內(nèi)容,完全刪除該部分內(nèi)容或者用其他字符串來替換它。使用工具:如Word、NotePad++、EditPlus等文字編輯器中的查找功能都支持正則表達(dá)式,用正則表達(dá)式你就可以實(shí)現(xiàn)更加多樣化的查找。還有像VS、CodeBlock、Eclipse、Intellij
Idea等開發(fā)工具的IDE的查找替換功能也都支持正則表達(dá)式,用它你可以修改變量名,調(diào)整代碼格式,統(tǒng)計(jì)代碼行數(shù)等。
常用正則表達(dá)式總結(jié)常用的正則表達(dá)式已經(jīng)有很多人做了總結(jié)了,在網(wǎng)上能夠找到非常多,我就沒有再寫的必要了。下面貼出我覺得還不錯(cuò)的一個(gè)總結(jié)。此部分內(nèi)容為轉(zhuǎn)載,來自:/zxin/archive/2013/01/26/2877765.html
一、校驗(yàn)數(shù)字的表達(dá)式1數(shù)字:^[0-9]*$2n位的數(shù)字:^\d{n}$3至少n位的數(shù)字:^\d{n,}$4m-n位的數(shù)字:^\d{m,n}$5零和非零開頭的數(shù)字:^(0|[1-9][0-9]*)$6非零開頭的最多帶兩位小數(shù)的數(shù)字:^([1-9][0-9]*)+(.[0-9]{1,2})?$7帶1-2位小數(shù)的正數(shù)或負(fù)數(shù):^(\-)?\d+(\.\d{1,2})?$8正數(shù)、負(fù)數(shù)、和小數(shù):^(\-|\+)?\d+(\.\d+)?$9有兩位小數(shù)的正實(shí)數(shù):^[0-9]+(.[0-9]{2})?$10有1~3位小數(shù)的正實(shí)數(shù):^[0-9]+(.[0-9]{1,3})?$11非零的正整數(shù):^[1-9]\d*$或^([1-9][0-9]*){1,3}$或^\+?[1-9][0-9]*$12非零的負(fù)整數(shù):^\-[1-9][]0-9"*$或^-[1-9]\d*$13非負(fù)整數(shù):^\d+$或^[1-9]\d*|0$14非正整數(shù):^-[1-9]\d*|0$或^((-\d+)|(0+))$15非負(fù)浮點(diǎn)數(shù):^\d+(\.\d+)?$或^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$16非正浮點(diǎn)數(shù):^((-\d+(\.\d+)?)|(0+(\.0+)?))$或^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$17正浮點(diǎn)數(shù):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$或^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$18負(fù)浮點(diǎn)數(shù):^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$或^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$19浮點(diǎn)數(shù):^(-?\d+)(\.\d+)?$或^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$二、校驗(yàn)字符的表達(dá)式1漢字:^[\u4e00-\u9fa5]{0,}$2英文和數(shù)字:^[A-Za-z0-9]+$或^[A-Za-z0-9]{4,40}$3長度為3-20的所有字符:^.{3,20}$4由26個(gè)英文字母組成的字符串:^[A-Za-z]+$5由26個(gè)大寫英文字母組成的字符串:^[A-Z]+$6由26個(gè)小寫英文字母組成的字符串:^[a-z]+$7由數(shù)字和26個(gè)英文字母組成的字符串:^[A-Za-z0-9]+$8由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串:^\w+$或^\w{3,20}$9中文、英文、數(shù)字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$10中文、英文、數(shù)字但不包括下劃線等符號(hào):^[\u4E00-\u9FA5A-Za-z0-9]+$或^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$11可以輸入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+12禁止輸入含有~的字符:[^~\x22]+三、特殊需求表達(dá)式1Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$2域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?3InternetURL:[a-zA-z]+://[^\s]*或^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$4手機(jī)號(hào)碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$5電話號(hào)碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$6國內(nèi)電話號(hào)碼021-87888822):\d{3}-\d{8}|\d{4}-\d{7}7身份證號(hào)(15位、18位數(shù)字):^\d{15}|\d{18}$8短身份證號(hào)碼(數(shù)字、字母x結(jié)尾):^([0-9]){7,18}(x|X)?$或^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$9帳號(hào)是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$10密碼(以字母開頭,長度在6~18之間,只能包含字母、數(shù)字和下劃線):^[a-zA-Z]\w{5,17}$11強(qiáng)密碼(必須包含大小寫字母和數(shù)字的組合,不能使用特殊字符,長度在8-10之間):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$12日期格式:^\d{4}-\d{1,2}-\d{1,2}13一年的12個(gè)月(01~09和1~12):^(0?[1-9]|1[0-2])$14一個(gè)月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$15錢的輸入格式:161.有四種錢的表示形式我們可以接受:"10000.00"和"10,000.00",和沒有"分"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市公園建設(shè)合同協(xié)議書內(nèi)容
- 職場人際沖突調(diào)解援助政策
- 知識(shí)分享意見箱管理
- 餐飲業(yè)員工傷害管理
- 電子產(chǎn)品裝卸人員招聘合同
- 紹興郊區(qū)農(nóng)家樂租賃
- 服裝設(shè)計(jì)授權(quán)委托書樣本模板
- 上市公司隔音墻施工合同
- 2024技術(shù)顧問服務(wù)協(xié)議系列篇版B版
- 城市公共自行車系統(tǒng)工程合同樣本
- DB12T 1341-2024 消防產(chǎn)品使用和維護(hù)管理規(guī)范
- AQ/T 1119-2023 煤礦井下人員定位系統(tǒng)通 用技術(shù)條件(正式版)
- 幼兒園班級(jí)幼兒圖書目錄清單(大中小班)
- 2024-2034年全球及中國年糕行業(yè)市場發(fā)展分析及前景趨勢與投資發(fā)展研究報(bào)告
- 烈士陵園的數(shù)字化轉(zhuǎn)型與智能服務(wù)
- 生理學(xué)重點(diǎn)復(fù)習(xí)資料全
- 初中生理想信念教育班會(huì)(3篇模板)
- (高清版)JGT 225-2020 預(yù)應(yīng)力混凝土用金屬波紋管
- 2024年上海市奉賢區(qū)中考一模英語試題(含答案解析)
- 農(nóng)產(chǎn)品加工與貯藏原理復(fù)習(xí)資料
- (正式版)JBT 5300-2024 工業(yè)用閥門材料 選用指南
評(píng)論
0/150
提交評(píng)論