日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JavaScript正则表达式语法与示例

發(fā)布時(shí)間:2024/4/13 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript正则表达式语法与示例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正則表達(dá)式介紹

1、正則表達(dá)式是用于匹配字符串中字符組合的模式。正則表達(dá)式的模式規(guī)則是由一個(gè)字符序列組成的。包括所有字母和數(shù)字在內(nèi),大多數(shù)的字符都是直接按照直接量描述待匹配的字符。除此之外,正則表達(dá)式還有其他特殊語(yǔ)義的字符,這些字符不按照特殊含義進(jìn)行匹配。
2、正則表達(dá)式是一個(gè)描述字符模式的對(duì)象。js中的正則表達(dá)式用RegExp對(duì)象表示,可以進(jìn)行強(qiáng)大的模式匹配和文本的檢索與替換功能。正則表達(dá)式的模式規(guī)則由一個(gè)字符串序列組成。

例如:

1、runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 號(hào)代表前面的字符必須至少出現(xiàn)一次(1次或多次)。

2、runoo*b,可以匹配 runob、runoob、runoooooob 等,* 號(hào)代表字符可以不出現(xiàn),也可以出現(xiàn)一次或者多次(0次、或1次、或多次)。

3、colou?r?可以匹配 color 或者 colour,? 問(wèn)號(hào)代表前面的字符最多只可以出現(xiàn)一次(0次、或1次)。

?

正則表達(dá)式作用

基于正則表達(dá)式我們可以

a,測(cè)試字符串內(nèi)模式,比如測(cè)試電話號(hào)碼是否符合規(guī)則可以成為數(shù)據(jù)驗(yàn)證,

b,替換文本,可以使用正則表達(dá)式識(shí)別文檔中的特定文本,完全刪除或者使用其他文本替換它。

c,基于模式匹配從字符串中提取字符串

?

正則表達(dá)式創(chuàng)建

JavaScript 中的正則表達(dá)式用 RegExp 對(duì)象表示,有兩種創(chuàng)建方式。
1. 直接量語(yǔ)法創(chuàng)建
正則表達(dá)式直接量定義為包含在一對(duì)斜杠(/)之間的字符。

2. 構(gòu)造函創(chuàng)建
可以通過(guò)?RegExp()?構(gòu)造函數(shù)可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建正則表達(dá)式。RegExp?的第二個(gè)參數(shù)是可選的。

new RegExp(pattern [, flags])
RegExp(pattern [, flags])
其中?pattern?可以是字符串或者正則字面量。當(dāng)?pattern?是字符串時(shí),需要常規(guī)的字符轉(zhuǎn)義規(guī)則,必須將?\?替換成?\\,比如?/\w+/?等價(jià)于?new RegExp("\\w+")。

?

普通字符

普通字符包括沒(méi)有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數(shù)字、所有標(biāo)點(diǎn)符號(hào)和一些其他符號(hào)。

?

非打印字符

非打印字符也可以是正則表達(dá)式的組成部分。下表列出了表示非打印字符的轉(zhuǎn)義序列:

?

特殊字符

所謂特殊字符,就是一些有特殊含義的字符,如上面說(shuō)的?runoo*b?中的?*,簡(jiǎn)單的說(shuō)就是表示任何字符串的意思。如果要查找字符串中的?*?符號(hào),則需要對(duì)?*?進(jìn)行轉(zhuǎn)義,即在其前加一個(gè)?\:?runo\*ob?匹配 runo*ob。

許多元字符要求在試圖匹配它們時(shí)特別對(duì)待。若要匹配這些特殊字符,必須首先使字符"轉(zhuǎn)義",即,將反斜杠字符\?放在它們前面。下表列出了正則表達(dá)式中的特殊字符:

?

限定符

限定符用來(lái)指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足匹配。有?*?或?+?或???或?{n}?或?{n,}?或?{n,m}?共6種。

正則表達(dá)式的限定符有:

由于章節(jié)編號(hào)在大的輸入文檔中會(huì)很可能超過(guò)九,所以您需要一種方式來(lái)處理兩位或三位章節(jié)編號(hào)。限定符給您這種能力。下面的正則表達(dá)式匹配編號(hào)為任何位數(shù)的章節(jié)標(biāo)題:

/Chapter [1-9][0-9]*/

請(qǐng)注意,限定符出現(xiàn)在范圍表達(dá)式之后。因此,它應(yīng)用于整個(gè)范圍表達(dá)式,在本例中,只指定從 0 到 9 的數(shù)字(包括 0 和 9)。

這里不使用 + 限定符,因?yàn)樵诘诙€(gè)位置或后面的位置不一定需要有一個(gè)數(shù)字。也不使用 ? 字符,因?yàn)槭褂?? 會(huì)將章節(jié)編號(hào)限制到只有兩位數(shù)。您需要至少匹配 Chapter 和空格字符后面的一個(gè)數(shù)字。

如果您知道章節(jié)編號(hào)被限制為只有 99 章,可以使用下面的表達(dá)式來(lái)至少指定一位但至多兩位數(shù)字。

/Chapter [0-9]{1,2}/

上面的表達(dá)式的缺點(diǎn)是,大于 99 的章節(jié)編號(hào)仍只匹配開(kāi)頭兩位數(shù)字。另一個(gè)缺點(diǎn)是 Chapter 0 也將匹配。只匹配兩位數(shù)字的更好的表達(dá)式如下:

/Chapter [1-9][0-9]?/

?

直接量字符

正則表達(dá)式中所有字母和數(shù)字都是按照字面含義進(jìn)行匹配的,其他非字母的字符需要通過(guò)反斜杠(\)作為前綴進(jìn)行轉(zhuǎn)移,如?\n?匹配換行符。這些字符為直接量字符(literal characters)。這些字符都是精確匹配,每一個(gè)字符都只能匹配一個(gè)字符。

在正則表達(dá)式中,有一些標(biāo)點(diǎn)符號(hào)具有特殊含義,他們是:^ $ . * + ? = ! : | \ / ( ) [ ] { }?如果需要在正則表達(dá)式中與這些直接量進(jìn)行匹配,必須使用前綴?\。

如果不記得哪些標(biāo)點(diǎn)需要反斜杠轉(zhuǎn)義,可以在每個(gè)標(biāo)點(diǎn)符號(hào)前都加上反斜杠。

?

字符類

如果不想匹配某一個(gè)特定的字符而是想匹配某一類字符,則需要使用字符類。

通過(guò)將直接量字符放入方括號(hào)內(nèi),可以組成字符類(character class)。一個(gè)字符類可以匹配它所包含任意?一個(gè)?字符。如?[abc]?可以匹配 a,b,c 中任意一個(gè)字符。

使用?^?作為方括號(hào)中第一個(gè)字符來(lái)定義否定字符集,它匹配所有不包含在方框括號(hào)內(nèi)的字符。[^]?可以匹配任意字符。

字符類可以使用連字符來(lái)表示字符范圍。比如匹配小寫字母[a-z],匹配任何字母和數(shù)字可以用[a-zA-Z0-9]。

一些常用的字符類,在 JavaScript 中有特殊的轉(zhuǎn)義字符來(lái)表達(dá)它們。


方括號(hào)內(nèi)也可出現(xiàn)轉(zhuǎn)義字符,如?[\d\s]?表示匹配任意空白符或數(shù)字。


重復(fù)
當(dāng)一個(gè)模式需要被多次匹配的時(shí)候,正則表達(dá)式提供了表示重復(fù)的正則語(yǔ)法。


貪婪和非貪婪的重復(fù)
上面所有的重復(fù)都是“貪婪的”匹配,也就是匹配盡可能多的字符。如?/a+/?匹配?'aaaa'?時(shí),它會(huì)匹配?'aaaa'?。

如果想要盡可能少的匹配,只需要在重復(fù)的標(biāo)記后加一個(gè)問(wèn)號(hào)(?)即可。如?/a+?/?匹配?'aaaa'?時(shí),它會(huì)匹配?'a'?。

注意:正則表達(dá)式的模式匹配總會(huì)尋找字符串中第一個(gè)可能匹配的位置,這意味這?/a+?b/?匹配?'aaab'?時(shí),匹配到的是?'aaab'?而不是?'ab'。

?

選擇、分組和引用

選擇
字符?|?用于分隔供選擇的模式,匹配時(shí)會(huì)嘗試從左到右匹配每一個(gè)分組,直到發(fā)現(xiàn)匹配項(xiàng)。如?/ab|bc|cd/?可以匹配字符串'ab'、'bc'?和?'cd'。

分組
圓括號(hào)可以把單獨(dú)的項(xiàng)組合成子表達(dá)式,以便可以像一個(gè)獨(dú)立的單元用?|、*、+?或者???對(duì)單元內(nèi)的項(xiàng)進(jìn)行處理。

引用
帶圓括號(hào)的表達(dá)式的另一個(gè)用途是允許在同一個(gè)正則表達(dá)式的后面引用前面的子表達(dá)式。通過(guò)\后面加數(shù)字實(shí)現(xiàn)。\n?表示第 n 個(gè)帶圓括號(hào)的子表達(dá)式。表示引用前一個(gè)表達(dá)式所匹配的文本。因?yàn)樽颖磉_(dá)式可以嵌套,所以根據(jù)子表達(dá)式左括號(hào)的位置進(jìn)行計(jì)數(shù)。

例,能匹配 1999-01-01 或 1999/01/01 的正則:/\d{4}([-//])\d{2}\1\d{2}/

具名引用
使用?(?<name>...)?的語(yǔ)法來(lái)為分組命名,并通過(guò)?\k<name>?在后面的正則表達(dá)式中引用。如上面的正則可以改寫為:/\d{4}(?<separator>[-//])\d{2}\k<separator>\d{2}/

忽略引用
如果只想用圓括號(hào)來(lái)表示子表達(dá)式,而不希望生成引用,可以使用?(?:)?來(lái)進(jìn)行分組。例,/(?:a)(?:b)(c)/?中?\1?將表示?(c)?所匹配的文本。

?

指定匹配位置(錨元素)

有一些正則表達(dá)式的元素不用來(lái)匹配實(shí)際的字符,而是匹配指定的位置。我們稱這些元素為正則表達(dá)式的錨。

正則表達(dá)式中的錨字符包括
1、用來(lái)匹配字符串的開(kāi)始,多行檢索時(shí)匹配一行的開(kāi)頭。
2、用來(lái)匹配字符串的結(jié)束,多行檢索時(shí)匹配一行的結(jié)尾。
3、用來(lái)匹配單詞的邊界,就是?\w?和?\W?之間的位置,或者?\w?和字符串的開(kāi)頭或結(jié)尾之間的位置。
4、匹配非單詞邊界的位置。
例:?/\bJava\b/?可以匹配?Java?卻不匹配?JavaScript。
注意:任意正則表達(dá)式都可以作為錨點(diǎn)條件。

先行斷言
(?=pattern)?它表示一個(gè)位置,該位置之后的字符能匹配?pattern?。如?/\d+(?=%)/?匹配字符串?'100%'?中的?'100'?但是不匹配?'100。'

負(fù)向先行斷言
(?!pattern)?它表示一個(gè)位置,該位置之后的字符能不匹配?pattern?。

后行斷言
(?<=pattern)?它表示一個(gè)位置,該位置之前的字符能匹配?pattern?。例,/(?<=\$)\d+/?匹配?'$100'?但是不匹配?'¥100'。

負(fù)向后行斷言
(?<!pattern)?它表示一個(gè)位置,該位置之前的字符能不匹配?pattern。

修飾符
在正則表達(dá)式的第二條斜線之后,可以指定一個(gè)或多個(gè)修飾符,/pattern/g。

常用修飾符

1、執(zhí)行不區(qū)分大小寫的匹配。
2、全局匹配。
3、多行匹配模式。
4、“粘連”(sticky)修飾符。y修飾符的作用與g修飾符類似,也是全局匹配,后一次匹配都從上一次匹配成功的下一個(gè)位置開(kāi)始。不同之處在于,g修飾符只要剩余位置中存在匹配就可,而y修飾符確保匹配必須從剩余的第一個(gè)位置開(kāi)始,這也就是“粘連”的涵義。
5、表示點(diǎn)(.)可以表示任意字符,不設(shè)置的話,四個(gè)字節(jié)的 UTF-16 字符和行終止符不能用 . 表示。
6、開(kāi)啟 “Unicode 模式”,用來(lái)正確處理大于?\uFFFF?的 Unicode 字符。也就是說(shuō),會(huì)正確處理四個(gè)字節(jié)的 UTF-16 編碼。
通過(guò)?RegExp.prototype.flags?可以獲得正則修飾符的字符串。/pattern/ig.flags?返回?"gi"

?

字符串的正則方法

String.prototype.search(regexp|substr)
返回第一個(gè)和參數(shù)匹配的子串的起始位置。沒(méi)有匹配子串返回?-1?。
如果參數(shù)不是正則表達(dá)式,將會(huì)通過(guò)?RegExp?構(gòu)造函數(shù)轉(zhuǎn)換成正則表達(dá)式。它會(huì)忽略正則的修飾符?g。

String.prototype.replace(regexp|substr, newSubStr|function)
第一個(gè)參數(shù)同search,查找指定子串。如果第二個(gè)表達(dá)式是字符串,將把第一個(gè)參數(shù)匹配的子串替換為?newSubStr。如果在替換字符串中出現(xiàn)了?$?加數(shù)字,replace?將用與指定的子表達(dá)式相匹配的文本來(lái)替換這些字符。

例,單書(shū)名號(hào)包裹文本改為書(shū)名號(hào)。'<JavaScript>和<正則表達(dá)式>'.replace(/<([^_]*?)>/g, '《$1》')?會(huì)得到?"《JavaScript》和《正則表達(dá)式》"

使用字符串作為參數(shù)時(shí)替換字符串可以插入下面的特殊變量名:

1、$$?插入一個(gè)?"$"
2、$&?插入匹配的子串。
3、`$`` 插入當(dāng)前匹配的子串左邊的內(nèi)容。
4、$'?插入當(dāng)前匹配的子串右邊的內(nèi)容。
5、$n?假如第一個(gè)參數(shù)是 RegExp對(duì)象,并且 n 是個(gè)小于100的非負(fù)整數(shù),那么插入第 n 個(gè)括號(hào)匹配的字符串。提示:索引是從1開(kāi)始使用函數(shù)作為第二個(gè)參數(shù)。

function replacer(match, p1, p2, p3, offset, string) { }
// match ? ? ? ?匹配的子串。
// p1,p2, ... ? 假如replace()方法的第一個(gè)參數(shù)是一個(gè)RegExp 對(duì)象,則代表第n個(gè)括號(hào)匹配的字符串。
// offset ? ? ? 匹配到的子字符串在原字符串中的偏移量。子串首字母下標(biāo)。
// string ? ? ? 被匹配的原字符串。

例,下劃線命名轉(zhuǎn)駝峰命名。'a_simple_name'.replace(/_([a-z])/g, (m, p1) => p1.toUpperCase())?將得到?"aSimpleName"。

String.prototype.match(regexp)
參數(shù)?regexp?為一個(gè)正則表達(dá)式對(duì)象。如果傳入一個(gè)非正則表達(dá)式對(duì)象,則會(huì)隱式地使用?new RegExp(obj)?將其轉(zhuǎn)換為一個(gè)?RegExp?。

如果?regexp?沒(méi)有設(shè)置修飾符?g,則僅返回第一個(gè)完整匹配及其相關(guān)的捕獲組(Array),返回?cái)?shù)組第一個(gè)字符是匹配字符串,余下的元素是正則表達(dá)式中圓括號(hào)括起來(lái)的子表達(dá)式。在這種情況下,返回的項(xiàng)目將具有如下所述的其他屬性(groups: 一個(gè)捕獲組數(shù)組 或?undefined(如果沒(méi)有定義命名捕獲組)。index: 匹配的結(jié)果的開(kāi)始位置。input: 搜索的字符串。),或者未匹配時(shí)返回?null?。

如果使用?g?標(biāo)志,則將返回與完整正則表達(dá)式匹配的所有結(jié)果,但不會(huì)返回捕獲組,或者未匹配時(shí)返回?null?。

'196.168.0.1'.match(/(\d+)(?=.|$)/) // (?=.|$) 先行匹配 匹配 . 或者字符串結(jié)尾
// (2) ["196", "196", index: 0, input: "196.168.0.1", groups: undefined]
'196.168.0.1'.match(/(?<num>\d+)(?=.|$)/) // (?<name>) 具名引用 見(jiàn)上文
// (2) ["196", "196", index: 0, input: "196.168.0.1", groups: {num: "196"}]
'196.168.0.1'.match(/\d+(?=.|$)/g)
// (4) ["196", "168", "0", "1"]

?

String.prototype.split([separator[, limit]])
separator?指定表示每個(gè)拆分應(yīng)發(fā)生的點(diǎn)的字符串,可以是一個(gè)字符串或正則表達(dá)式。如果空字符串("")被用作分隔符,則字符串會(huì)在每個(gè)字符之間分割。

limit?一個(gè)整數(shù),限定返回的分割片段數(shù)量。

例,'張三;李四,王五|趙六'.split(/[;\|,]/) // (4) ["張三", "李四", "王五", "趙六"]

RegExp 的屬性
flags?會(huì)返回正則表達(dá)式的修飾符。
表示對(duì)應(yīng)修飾符是否存在的只讀布爾值,global(表示是否帶有修飾符?g),ignoreCase?(i),multiline(m),sticky(y),dotAll(s),unicode(u)
source?只讀字符串,包含正則表達(dá)式的文本。
lastIndex?可讀/寫整數(shù)。如果帶有?g?修飾符,這個(gè)屬性存儲(chǔ)在整個(gè)字符串中下一次檢索的開(kāi)始位置。這個(gè)屬性會(huì)被?exec()?和?test()?方法用到。
?

RegExp 的方法
exec()
如果沒(méi)有找到任何屬性,將返回?null,如果找到匹配返回一個(gè)數(shù)組,該數(shù)組第一個(gè)元素是相匹配的字符串,余下的元素是與圓括號(hào)內(nèi)的子表達(dá)式相匹配的子串。

當(dāng)調(diào)用?exec()?的正則表達(dá)式具有修飾符?g?時(shí),它將把當(dāng)前正則表達(dá)式對(duì)象的?lastIndex?屬性設(shè)置為緊挨著匹配子串的字符位置。

注意即使兩次匹配的不是同一個(gè)字符串,lastIndex?還是會(huì)連續(xù)生效的。

let reg = /\d+/g;
reg.exec('25*10=250'); // ["25", index: 0, input: "25*10=250", groups: undefined]
reg.lastIndex; // 2
reg.exec('666'); // ["6", index: 2, input: "666", groups: undefined]
reg.lastIndex; // 3

test()
調(diào)用?test()?和?exec()?等價(jià),當(dāng)?exec()?返回結(jié)果不是?null,test()?返回?true,否則返回?false?。

String 的方法不會(huì)用到?lastIndex?屬性。

業(yè)余時(shí)間賺點(diǎn)零花錢點(diǎn)這里?https://mp.csdn.net/postedit/90601328

總結(jié)

以上是生活随笔為你收集整理的JavaScript正则表达式语法与示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。