摘要:用正則表達(dá)式語言創(chuàng)建的。匹配非數(shù)字的字符使用元字符元字符在正則表達(dá)式中有特殊含義的字符。正則表達(dá)式默認(rèn)是區(qū)別大小寫的。正則表達(dá)式的字符串表示。若是一個正則表達(dá)式,若有標(biāo)志則替換所有匹配之處,若沒有則只替換第一個匹配之處。
前言
好久之前就說要寫一篇正則表達(dá)式的文章,正則表達(dá)式總是記了又忘,忘了再記,記了再忘,卒。
言歸正傳,今天終于要研究一下這個謎一樣的正則表達(dá)式了。其實正則表達(dá)式并不難(真的嗎?orz)
本文轉(zhuǎn)自本人博客:http://lsxj615.com/2016/08/15...
在學(xué)習(xí)之前,我們需要弄明白,到底什么時候需要用到正則表達(dá)式,正則表達(dá)式的用途究竟是什么?
比如說,你正在搜索一個文件,這個文件里面包含單詞car(不區(qū)分大小寫),但是呢你又不想把包含字符串car的其他單詞(例如carry)也一起找出來,那么這個時候你就可以使用正則表達(dá)式來幫你解決問題。當(dāng)然,這只是眾多場景中的一種。正則表達(dá)式功能強大,可以幫你解決各種匹配文本問題。又或者表單驗證的方式,也可以使用正則表達(dá)式來解決。
簡單來說,正則表達(dá)式就是字符串,是用來匹配和處理文本的字符串。用正則表達(dá)式語言創(chuàng)建的。
正則表達(dá)式的語法 匹配字符.(英文句號):匹配任何一個單個字符
[]:匹配集合內(nèi)多個字符中的某個字符
e.g. [ns]a --> 匹配 na 或sa
[-]:匹配該區(qū)間內(nèi)的字符
e.g. [a-z] , [0-9]
^ 取非匹配:除了該字符集內(nèi)的字符,都可以匹配。只有當(dāng)^出現(xiàn)在[和]之間,且緊跟在[后面,才能發(fā)揮取非的作用。
e.g. [^0-9] 匹配非數(shù)字的字符
元字符:在正則表達(dá)式中有特殊含義的字符。若需要表示該字符本身,需使用轉(zhuǎn)義。
d 任何一個數(shù)字字符,相當(dāng)于[0-9]
D 任何一個非數(shù)字字符,相當(dāng)于1
w 任何一個字母數(shù)字字符或下劃線字符,相當(dāng)于[a-zA-Z0-9_]
W 任何一個非字母數(shù)字字符或非下劃線字符,相當(dāng)于2
s 任何一個空白字符,等價于[fnrtv]
S 任何一個非空白字符,等價于3
總而言之,小寫字母與大寫字母都是相反的,所以記住小寫字母的含義,大寫字母則是對應(yīng)的取非含義。
重復(fù)匹配? 0個或1個字符
e.g. [0-9]? 出現(xiàn)0次或一次,且最多只能出現(xiàn)1次數(shù)字。
+ 一個或多個字符
e.g. [0-9]+ 表示一個或多個連續(xù)的數(shù)字
* 0個或多個字符
e.g. [0-9]* 連續(xù)出現(xiàn)0次貨多次的數(shù)字
{n} 設(shè)置一個精確的重復(fù)的值
e.g. [0-9]{3} 三個數(shù)字
{min,max} 設(shè)置重復(fù)次數(shù)的最小值和最大值
e.g. [0-9]{2,4} 最少2個數(shù)字,最多4個數(shù)字
{min, } 設(shè)置重復(fù)次數(shù)的最小值
e.g. [0-9]{2,} 最少2個數(shù)字
為了防止出現(xiàn)重復(fù)匹配造成的過度匹配,因為*和+都是“貪婪型”元字符,它們在進(jìn)行匹配時會盡可能從一段文本的開頭一直匹配到這段文本的末尾,而不是碰到第一個匹配就結(jié)束。
那么這個時候就需要使用"懶惰型"。僅需在貪婪型元字符后加上?即可。如:*?,+?,{n,}?
位置匹配單詞邊界
B 非單詞邊界。查找前后都有多余空格的連字符。
^ 字符串開頭。出現(xiàn)在字符集合的外面且位于一個模式的開頭,^匹配字符串的開頭
$ 字符串結(jié)尾
Javascript中的正則表達(dá)式ECMAScript通過RegExp類型來支持正則表達(dá)式。
var expression = / pattern / flags;
其中pattern可以是任何簡單或復(fù)雜的正則表達(dá)式。
flags用來標(biāo)明正則表達(dá)式的行為。如下所示:
g : 全局模式。模式應(yīng)用于所有的字符串,不是在發(fā)現(xiàn)第一個匹配項后就立即停止的。
i : 不區(qū)分大小寫。正則表達(dá)式默認(rèn)是區(qū)別大小寫的。i則是忽略大小寫
m : 表示多行模式,也就是說到達(dá)一行文本末尾的時候還會繼續(xù)查找下一行中是否存在與模式匹配的項。
創(chuàng)建正則表達(dá)式的方式以字面量形式來定義
var pattern = /sxj/i;
使用RegExp構(gòu)造函數(shù)
var pattern = new RegExp("sxj", "i");
那么這兩種方式的區(qū)別除了形式不一樣,還有一個差別在于:
ECMAScript 3中,正則表達(dá)式字面量始終會共享同一個RegExp實例;而使用構(gòu)造函數(shù)創(chuàng)建的每一個實例都是一個新實例。
不過!【敲黑板!】ECMAScript 5明確規(guī)定了,使用正則表達(dá)式字面量必須想直接調(diào)用RegExp構(gòu)造函數(shù)一樣,每次都創(chuàng)建新的RegExp實例。而各大瀏覽器也對此進(jìn)行了修改。
RegExp實例 實例屬性global: 布爾值,表示是否設(shè)置了g標(biāo)志
ignoreCase: 布爾值,表示是否設(shè)置了i標(biāo)志
multiline: 布爾值,表示是否設(shè)置了m標(biāo)志
lastIndex:整數(shù),表示開始搜索下一個匹配項的字符位置,從0開始。
source: 正則表達(dá)式的字符串表示。按照字面量形式返回。
實例方法pattern.exec(text);
查找text中的匹配項。
//例子 var pattern = /sxj/i; var text = "sxj is a good student sxj haha"; console.log(pattern.exec(text)); //["sxj", index: 0, input: "sxj is a good student sxj haha"] var pattern2 = /shi/i; console.log(pattern2,exec(text));//null
從上述例子可以發(fā)現(xiàn),若找到,則返回一個數(shù)組,該數(shù)組包含第一個匹配項,除此之外,還有兩個屬性:index(匹配項在字符串中的位置),input(應(yīng)用正則表達(dá)式的字符串)。若沒有匹配項返回null。
對于exec而言,無論是否設(shè)置g全局標(biāo)志,每次也只會返回一個匹配項。但是如果在同一個字符串上多次調(diào)用,設(shè)置了g標(biāo)志則會繼續(xù)查找新的匹配項,而沒有設(shè)置的話只會返回第一個匹配項信息。除此之外,pattern的lastIndex屬性在全局模式會增加,非全局模式始終不變。
pattern.test(text);
查看目標(biāo)字符串與該模式是否匹配。匹配返回true,否則返回false。
String中的正則表達(dá)式text.match(pattern);
match匹配一個字符串和一個正則表達(dá)式。若沒有g標(biāo)識,則結(jié)果與pattern.exec(text)相同。若有g標(biāo)志,則返回一個包含所有匹配的數(shù)組。
text.search(pattern);
若找到匹配,返回第一個匹配的首字符位置。若沒有找到返回-1。
此方法會忽略g標(biāo)識,且沒有position參數(shù)。
string.replace(searchValue, replaceValue);
searchValue可以是一個字符串或一個正則表達(dá)式對象。若是一個字符串,只會在第一次出現(xiàn)的地方被替換。若是一個正則表達(dá)式,若有g標(biāo)志則替換所有匹配之處,若沒有則只替換第一個匹配之處。
總結(jié)正則表達(dá)式是個非常好用的工具,若掌握了可達(dá)到事半功倍的效果。好好學(xué)喲~
0-9 ?
a-zA-Z0-9_ ?
fnrtv ?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80072.html
閱讀 1230·2021-11-22 12:05
閱讀 1366·2021-09-29 09:35
閱讀 656·2019-08-30 15:55
閱讀 3155·2019-08-30 14:12
閱讀 978·2019-08-30 14:11
閱讀 2905·2019-08-30 13:10
閱讀 2435·2019-08-29 16:33
閱讀 3357·2019-08-29 11:02