正則表達(dá)式是由一些具有特殊含義的字符組成的字符串,多用于查找、替換符合規(guī)則的字符串。在表單驗(yàn)證、Url映射等處都會(huì)經(jīng)常用到。
平時(shí)可以使用正則表達(dá)式的在線測試工具練習(xí)和測試:正則表達(dá)式在線工具
【一】簡介
【1】通過 ? 和 * 的匹配認(rèn)識正則表達(dá)式
您很可能使用 ? 和 \* 通配符來查找硬盤上的文件。
\? 通配符匹配文件名中的 0 個(gè)或 1 個(gè)字符
而 * 通配符匹配零個(gè)或多個(gè)字符。
像 data(\w)?\.dat 這樣的模式將查找下列文件:
data.dat
data1.dat
data2.dat
datax.dat
dataN.dat
使用 * 字符代替 ? 字符擴(kuò)大了找到的文件的數(shù)量。
data.*\.dat 匹配下列所有文件:
data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat
【2】一個(gè)簡單的實(shí)例
(1)^ 為匹配輸入字符串的開始位置。
(2)[0-9]+匹配多個(gè)數(shù)字, [0-9] 匹配單個(gè)數(shù)字,+ 匹配一個(gè)或者多個(gè)。
(3)abc$匹配字母 abc 并以 abc 結(jié)尾,$ 為匹配輸入字符串的結(jié)束位置。
【3】填寫用戶注冊表單時(shí)的規(guī)則設(shè)定
我們在寫用戶注冊表單時(shí),只允許用戶名包含字符、數(shù)字、下劃線和連接字符 -,并設(shè)置用戶名的長度,我們就可以使用以下正則表達(dá)式來設(shè)定。
以上的正則表達(dá)式可以匹配 runoob、runoob1、run-oob、run_oob, 但不匹配 ru,因?yàn)樗淖帜柑塘?,小?3 個(gè)無法匹配。也不匹配 runoob$, 因?yàn)樗厥庾址?/p>
【4】正則表達(dá)式的模式
正則表達(dá)式的模式可以包括以下內(nèi)容:
(1)字面值字符:例如字母、數(shù)字、空格等,可以直接匹配它們自身。
(2)特殊字符:例如點(diǎn)號 .、星號 *、加號 +、問號 ? 等,它們具有特殊的含義和功能。
(3)特殊字符:例如點(diǎn)號 .、星號 *、加號 +、問號 ? 等,它們具有特殊的含義和功能。
(4)元字符:例如 \d、\w、\s 等,用于匹配特定類型的字符,如數(shù)字、字母、空白字符等。
(5)量詞:例如 {n}、{n,}、{n,m} 等,用于指定匹配的次數(shù)或范圍。
(6)邊界符號:例如 ^、$、\b、\B 等,用于匹配字符串的開頭、結(jié)尾或單詞邊界位置。
【二】語法
【1】普通字符
普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數(shù)字、所有標(biāo)點(diǎn)符號和一些其他符號。
(1)[ABC]
匹配 […] 中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母。
(2)[^ABC]
匹配除了 […] 中字符的所有字符,例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字符。
(3)[A-Z]
[A-Z] 表示一個(gè)區(qū)間,匹配所有大寫字母,[a-z] 表示所有小寫字母。
(4).
匹配除換行符(\n、\r)之外的任何單個(gè)字符,相等于 [^\n\r]。
(5)[\s\S]
匹配所有。\s 是匹配所有空白符,包括換行,\S 非空白符,不包括換行。
(6)\w
匹配字母、數(shù)字、下劃線。等價(jià)于 [A-Za-z0-9_]
【2】非打印字符
非打印字符也可以是正則表達(dá)式的組成部分。下表列出了表示非打印字符的轉(zhuǎn)義序列:
(1)\cx 匹配由x指明的控制字符。例如, \cM 匹配一個(gè) Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 'c' 字符。
(2)\f 匹配一個(gè)換頁符。等價(jià)于 \x0c 和 \cL。
(3)\n 匹配一個(gè)換行符。等價(jià)于 \x0a 和 \cJ。
(4)\r 匹配一個(gè)回車符。等價(jià)于 \x0d 和 \cM。
(5)\s 匹配任何空白字符,包括空格、制表符、換頁符等等。等價(jià)于 [
(6)\f\n\r\t\v]。注意 Unicode 正則表達(dá)式會(huì)匹配全角空格符。
(7)\S 匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。
(8)\t 匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI。
(9)\v 匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK。
【3】特殊字符
所謂特殊字符,就是一些有特殊含義的字符,如上面說的 runoo*b 中的 ,簡單的說就是表示任何字符串的意思。如果要查找字符串中的 * 符號,則需要對 * 進(jìn)行轉(zhuǎn)義,即在其前加一個(gè) \,runo*ob 匹配字符串 runoob。
許多元字符要求在試圖匹配它們時(shí)特別對待。若要匹配這些特殊字符,必須首先使字符"轉(zhuǎn)義",即,將反斜杠字符\ 放在它們前面。下表列出了正則表達(dá)式中的特殊字符:
(1)$ 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請使用 \$。
(2)( ) 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。子表達(dá)式可以獲取供以后使用。要匹配這些字符,請使用 \( 和 \)。
(3)* 匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請使用 \*。
(4)+ 匹配前面的子表達(dá)式一次或多次。要匹配 + 字符,請使用 \+。
(5). 匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 \. 。
(6)[ 標(biāo)記一個(gè)中括號表達(dá)式的開始。要匹配 [,請使用 \[。
(7)? 匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符。要匹配 ? 字符,請使用 \?。
(8)\ 將下一個(gè)字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八進(jìn)制轉(zhuǎn)義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
(9)^ 匹配輸入字符串的開始位置,除非在方括號表達(dá)式中使用,當(dāng)該符號在方括號表達(dá)式中使用時(shí),表示不接受該方括號表達(dá)式中的字符集合。要匹配 ^ 字符本身,請使用 \^。
(10){ 標(biāo)記限定符表達(dá)式的開始。要匹配 {,請使用 \{。
(11)| 指明兩項(xiàng)之間的一個(gè)選擇。要匹配 |,請使用 \|。
【4】限定符
限定符用來指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6種。
正則表達(dá)式的限定符有:
(1)* 匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價(jià)于 {0,}。 嘗試一下 ?
(2)+ 匹配前面的子表達(dá)式一次或多次。例如,zo+ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價(jià)于 {1,}。 嘗試一下 ?
(3)? 匹配前面的子表達(dá)式零次或一次。例如,do(es)? 可以匹配 "do" 、 "does"、 "doxy" 中的 "do" 和 "does"。? 等價(jià)于 {0,1}。
(4){n} n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,o{2} 不能匹配 "Bob" 中的 o,但是能匹配 "food" 中的兩個(gè) o。
(5){n,} n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次。例如,o{2,} 不能匹配 "Bob" 中的 o,但能匹配 "foooood" 中的所有 o。o{1,} 等價(jià)于 o+。o{0,} 則等價(jià)于 o*。
(6){n,m} m 和 n 均為非負(fù)整數(shù),其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 將匹配 "fooooood" 中的前三個(gè) o。o{0,1} 等價(jià)于 o?。請注意在逗號和兩個(gè)數(shù)之間不能有空格。
(1)匹配一個(gè)正整數(shù)
以下正則表達(dá)式匹配一個(gè)正整數(shù),[1-9]設(shè)置第一個(gè)數(shù)字不是 0,[0-9]* 表示任意多個(gè)數(shù)字:
/[1-9][0-9]*/
請注意,限定符出現(xiàn)在范圍表達(dá)式之后。因此,它應(yīng)用于整個(gè)范圍表達(dá)式,在本例中,只指定從 0 到 9 的數(shù)字(包括 0 和 9)。
這里不使用 + 限定符,因?yàn)樵诘诙€(gè)位置或后面的位置不一定需要有一個(gè)數(shù)字。也不使用 ? 字符,因?yàn)槭褂?? 會(huì)將整數(shù)限制到只有兩位數(shù)。
(2)至少指定一位但至多兩位數(shù)字
如果你想設(shè)置 0~99 的兩位數(shù),可以使用下面的表達(dá)式來至少指定一位但至多兩位數(shù)字。
/[0-9]{1,2}/
上面的表達(dá)式的缺點(diǎn)是,只能匹配兩位數(shù)字,而且可以匹配 0、00、01、10 99 的章節(jié)編號仍只匹配開頭兩位數(shù)字。
(3)匹配 1~99 的正整數(shù)
改進(jìn)下,匹配 1~99 的正整數(shù)表達(dá)式如下:
/[1-9][0-9]?/
或
/[1-9][0-9]{0,1}/
(4)貪婪和非貪婪
* 和 + 限定符都是貪婪的,因?yàn)樗鼈儠?huì)盡可能多的匹配文字,只有在它們的后面加上一個(gè) ? 就可以實(shí)現(xiàn)非貪婪或最小匹配。
例如,您可能搜索 HTML 文檔,以查找在 h1 標(biāo)簽內(nèi)的內(nèi)容。HTML 代碼如下:
<h1>RUNOOB-菜鳥教程</h1>
貪婪:下面的表達(dá)式匹配從開始小于符號 (<) 到關(guān)閉 h1 標(biāo)記的大于符號 (>) 之間的所有內(nèi)容。
/<.*>/
非貪婪:如果您只需要匹配開始和結(jié)束 h1 標(biāo)簽,下面的非貪婪表達(dá)式只匹配 <h1>。
/<.*?>/
也可以使用以下正則表達(dá)式來匹配 h1 標(biāo)簽,表達(dá)式則是:
/<\w+?>/
通過在 *、+ 或 ? 限定符之后放置 ?,該表達(dá)式從"貪婪"表達(dá)式轉(zhuǎn)換為"非貪婪"表達(dá)式或者最小匹配。
【5】定位符
定位符使您能夠?qū)⒄齽t表達(dá)式固定到行首或行尾。它們還使您能夠創(chuàng)建這樣的正則表達(dá)式,這些正則表達(dá)式出現(xiàn)在一個(gè)單詞內(nèi)、在一個(gè)單詞的開頭或者一個(gè)單詞的結(jié)尾。
定位符用來描述字符串或單詞的邊界,^ 和 $ 分別指字符串的開始與結(jié)束,\b 描述單詞的前或后邊界,\B 表示非單詞邊界。
正則表達(dá)式的定位符有:
(1)^ 匹配輸入字符串開始的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,^ 還會(huì)與 \n 或 \r 之后的位置匹配。
(2)$ 匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,$ 還會(huì)與 \n 或 \r 之前的位置匹配。
(3)\b 匹配一個(gè)單詞邊界,即字與空格間的位置。
(4)\B 非單詞邊界匹配。
注意:不能將限定符與定位符一起使用。由于在緊靠換行或者單詞邊界的前面或后面不能有一個(gè)以上位置,因此不允許諸如 ^* 之類的表達(dá)式。
若要匹配一行文本開始處的文本,請?jiān)谡齽t表達(dá)式的開始使用 ^ 字符。不要將 ^ 的這種用法與中括號表達(dá)式內(nèi)的用法混淆。
若要匹配一行文本的結(jié)束處的文本,請?jiān)谡齽t表達(dá)式的結(jié)束處使用 $ 字符。
若要在搜索章節(jié)標(biāo)題時(shí)使用定位點(diǎn),下面的正則表達(dá)式匹配一個(gè)章節(jié)標(biāo)題,該標(biāo)題只包含兩個(gè)尾隨數(shù)字,并且出現(xiàn)在行首:
/^Chapter [1-9][0-9]{0,1}/
真正的章節(jié)標(biāo)題不僅出現(xiàn)行的開始處,而且它還是該行中僅有的文本。它既出現(xiàn)在行首又出現(xiàn)在同一行的結(jié)尾。下面的表達(dá)式能確保指定的匹配只匹配章節(jié)而不匹配交叉引用。通過創(chuàng)建只匹配一行文本的開始和結(jié)尾的正則表達(dá)式,就可做到這一點(diǎn)。
/^Chapter [1-9][0-9]{0,1}$/
匹配單詞邊界稍有不同,但向正則表達(dá)式添加了很重要的能力。單詞邊界是單詞和空格之間的位置。非單詞邊界是任何其他位置。下面的表達(dá)式匹配單詞 Chapter 的開頭三個(gè)字符,因?yàn)檫@三個(gè)字符出現(xiàn)在單詞邊界后面:
/\bCha/
\b 字符的位置是非常重要的。如果它位于要匹配的字符串的開始,它在單詞的開始處查找匹配項(xiàng)。如果它位于字符串的結(jié)尾,它在單詞的結(jié)尾處查找匹配項(xiàng)。例如,下面的表達(dá)式匹配單詞 Chapter 中的字符串 ter,因?yàn)樗霈F(xiàn)在單詞邊界的前面:
/ter\b/
下面的表達(dá)式匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt:
/\Bapt/
字符串 apt 出現(xiàn)在單詞 Chapter 中的非單詞邊界處,但出現(xiàn)在單詞 aptitude 中的單詞邊界處。對于 \B 非單詞邊界運(yùn)算符,不可以匹配單詞的開頭或結(jié)尾,如果是下面的表達(dá)式,就不匹配 Chapter 中的 Cha:
\BCha
【6】選擇
用圓括號 () 將所有選擇項(xiàng)括起來,相鄰的選擇項(xiàng)之間用 | 分隔。
() 表示捕獲分組,() 會(huì)把每個(gè)分組里的匹配的值保存起來, 多個(gè)匹配值可以通過數(shù)字 n 來查看(n 是一個(gè)數(shù)字,表示第 n 個(gè)捕獲組的內(nèi)容)。
但用圓括號會(huì)有一個(gè)副作用,使相關(guān)的匹配會(huì)被緩存,此時(shí)可用 ?: 放在第一個(gè)選項(xiàng)前來消除這種副作用。
其中 ?: 是非捕獲元之一,還有兩個(gè)非捕獲元是 ?= 和 ?!,這兩個(gè)還有更多的含義,前者為正向預(yù)查,在任何開始匹配圓括號內(nèi)的正則表達(dá)式模式的位置來匹配搜索字符串,后者為負(fù)向預(yù)查,在任何開始不匹配該正則表達(dá)式模式的位置來匹配搜索字符串。
以下列出 ?=、?<=、?!、?<! 的使用區(qū)別
(1)exp1(?=exp2):查找 exp2 前面的 exp1。
(2)(?<=exp2)exp1:查找 exp2 后面的 exp1。
(3)exp1(?!exp2):查找后面不是 exp2 的 exp1。
(4)(?<!exp2)exp1:查找前面不是 exp2 的 exp1。
【7】反向引用
(1)介紹
對一個(gè)正則表達(dá)式模式或部分模式兩邊添加圓括號將導(dǎo)致相關(guān)匹配存儲到一個(gè)臨時(shí)緩沖區(qū)中,所捕獲的每個(gè)子匹配都按照在正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲。緩沖區(qū)編號從 1 開始,最多可存儲 99 個(gè)捕獲的子表達(dá)式。每個(gè)緩沖區(qū)都可以使用 \n 訪問,其中 n 為一個(gè)標(biāo)識特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)。
可以使用非捕獲元字符 ?:、?= 或 ?! 來重寫捕獲,忽略對相關(guān)匹配的保存。
(2)案例一
反向引用的最簡單的、最有用的應(yīng)用之一,是提供查找文本中兩個(gè)相同的相鄰單詞的匹配項(xiàng)的能力。以下面的句子為例:
Is is the cost of of gasoline going up up?
上面的句子很顯然有多個(gè)重復(fù)的單詞。如果能設(shè)計(jì)一種方法定位該句子,而不必查找每個(gè)單詞的重復(fù)出現(xiàn),那該有多好。下面的正則表達(dá)式使用單個(gè)子表達(dá)式來實(shí)現(xiàn)這一點(diǎn):
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/igm;
document.write(str.match(patt1));
捕獲的表達(dá)式,正如 [a-z]+ 指定的,包括一個(gè)或多個(gè)字母。正則表達(dá)式的第二部分是對以前捕獲的子匹配項(xiàng)的引用,即,單詞的第二個(gè)匹配項(xiàng)正好由括號表達(dá)式匹配。\1 指定第一個(gè)子匹配項(xiàng)。
單詞邊界元字符確保只檢測整個(gè)單詞。否則,諸如 “is issued” 或 “this is” 之類的詞組將不能正確地被此表達(dá)式識別。
正則表達(dá)式后面的全局標(biāo)記 g 指定將該表達(dá)式應(yīng)用到輸入字符串中能夠查找到的盡可能多的匹配。
表達(dá)式的結(jié)尾處的不區(qū)分大小寫 i 標(biāo)記指定不區(qū)分大小寫。
多行標(biāo)記 m 指定換行符的兩邊可能出現(xiàn)潛在的匹配。
(3)案例二
反向引用還可以將通用資源指示符 (URI) 分解為其組件。假定您想將下面的 URI 分解為協(xié)議(ftp、http 等等)、域地址和頁/路徑:
https://www.runoob.com:80/html/html-tutorial.html
下面的正則表達(dá)式提供該功能:
var str = "https://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1);
for (var i = 0; i < arr.length ; i++) {
document.write(arr[i]);
document.write("<br>");
}
第三行代碼 str.match(patt1) 返回一個(gè)數(shù)組,實(shí)例中的數(shù)組包含 5 個(gè)元素,索引 0 對應(yīng)的是整個(gè)字符串,索引 1 對應(yīng)第一個(gè)匹配符(括號內(nèi)),以此類推。
第一個(gè)括號子表達(dá)式捕獲 Web 地址的協(xié)議部分。該子表達(dá)式匹配在冒號和兩個(gè)正斜杠前面的任何單詞。
第二個(gè)括號子表達(dá)式捕獲地址的域地址部分。子表達(dá)式匹配非 : 和 / 之后的一個(gè)或多個(gè)字符。
第三個(gè)括號子表達(dá)式捕獲端口號(如果指定了的話)。該子表達(dá)式匹配冒號后面的零個(gè)或多個(gè)數(shù)字。只能重復(fù)一次該子表達(dá)式。
最后,第四個(gè)括號子表達(dá)式捕獲 Web 地址指定的路徑和 / 或頁信息。該子表達(dá)式能匹配不包括 # 或空格字符的任何字符序列。
將正則表達(dá)式應(yīng)用到上面的 URI,各子匹配項(xiàng)包含下面的內(nèi)容:
第一個(gè)括號子表達(dá)式包含 https
第二個(gè)括號子表達(dá)式包含 www.runoob.com
第三個(gè)括號子表達(dá)式包含 :80
第四個(gè)括號子表達(dá)式包含 /html/html-tutorial.html
【三】修飾符
標(biāo)記也稱為修飾符,正則表達(dá)式的標(biāo)記用于指定額外的匹配策略。
標(biāo)記不寫在正則表達(dá)式里,標(biāo)記位于表達(dá)式之外,格式如下:
/pattern/flags
正則表達(dá)式常用的修飾符:
(1)i ignore - 不區(qū)分大小寫 將匹配設(shè)置為不區(qū)分大小寫,搜索時(shí)不區(qū)分大小寫: A 和 a 沒有區(qū)別。
(2)g global - 全局匹配 查找所有的匹配項(xiàng)。
(3)m multi line - 多行匹配 使邊界字符 ^ 和 $ 匹配每一行的開頭和結(jié)尾,記住是多行,而不是整個(gè)字符串的開頭和結(jié)尾。
(4)s 特殊字符圓點(diǎn) . 中包含換行符 \n 默認(rèn)情況下的圓點(diǎn) . 是匹配除換行符 \n 之外的任何字符,加上 s 修飾符之后, . 中包含換行符 \n。
【1】g 修飾符
g 修飾符可以查找字符串中所有的匹配項(xiàng):
在字符串中查找 “runoob”:
var str="Google runoob taobao runoob";
var n1=str.match(/runoob/); // 查找第一次匹配項(xiàng)
var n2=str.match(/runoob/g); // 查找所有匹配項(xiàng)
【2】i 修飾符
i 修飾符為不區(qū)分大小寫匹配,實(shí)例如下:
在字符串中查找 “runoob”:
var str="Google runoob taobao RUNoob";
var n1=str.match(/runoob/g); // 區(qū)分大小寫
var n2=str.match(/runoob/gi); // 不區(qū)分大小寫
【3】m 修飾符
m 修飾符可以使 ^ 和 $ 匹配一段文本中每行的開始和結(jié)束位置。
g 只匹配第一行,添加 m 之后實(shí)現(xiàn)多行。
以下實(shí)例字符串中使用 \n 來換行:
在字符串中查找 “runoob”:
var str="runoobgoogle\ntaobao\nrunoobweibo";
var n1=str.match(/^runoob/g); // 匹配一個(gè)
var n2=str.match(/^runoob/gm); // 多行匹配
【4】s 修飾符
默認(rèn)情況下的圓點(diǎn) . 是 匹配除換行符 \n 之外的任何字符,加上 s 之后, . 中包含換行符 \n。
s 修飾符實(shí)例如下:
在字符串中查找:
var str="google\nrunoob\ntaobao";
var n1=str.match(/google./); // 沒有使用 s,無法匹配\n
var n2=str.match(/runoob./s); // 使用 s,匹配\n
【四】元字符
【1】字符匹配
(1)普通字符:普通字符按照字面意義進(jìn)行匹配,例如匹配字母 "a" 將匹配到文本中的 "a" 字符。
(2)元字符:元字符具有特殊的含義,例如 \d 匹配任意數(shù)字字符,\w 匹配任意字母數(shù)字字符,. 匹配任意字符(除了換行符)等。
【2】量詞
(1)*:匹配前面的模式零次或多次。
(2)+:匹配前面的模式一次或多次。
(3)?:匹配前面的模式零次或一次。
(4){n}:匹配前面的模式恰好 n 次。
(5){n,}:匹配前面的模式至少 n 次。
(6){n,m}:匹配前面的模式至少 n 次且不超過 m 次。
【3】字符類
(1)[ ]:匹配括號內(nèi)的任意一個(gè)字符。例如,[abc] 匹配字符 "a"、"b" 或 "c"。
(2)[^ ]:匹配除了括號內(nèi)的字符以外的任意一個(gè)字符。例如,[^abc] 匹配除了字符 "a"、"b" 或 "c" 以外的任意字符。
【4】邊界匹配
(1)^:匹配字符串的開頭。
(2)$:匹配字符串的結(jié)尾。
(3)\b:匹配單詞邊界。
(4)\B:匹配非單詞邊界。
【5】分組和捕獲
(1)( ):用于分組和捕獲子表達(dá)式。
(2)(?: ):用于分組但不捕獲子表達(dá)式。
【6】特殊字符
(1)\:轉(zhuǎn)義字符,用于匹配特殊字符本身。
(2).:匹配任意字符(除了換行符)。
(3)|:用于指定多個(gè)模式的選擇。
【7】常用的元字符
元字符:即為有特定含義的字符,常見的元字符如下
. 匹配除換行符以外的任意字符
\w 匹配字母或數(shù)字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數(shù)字
\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始(在集合字符里[^a]表示非(不匹配)的意思
$ 匹配字符串的結(jié)束
【8】詳解和示例
(1). 匹配任何任意字符 例如 . 可以匹配 1,n,*,+,- ,等
(2)\d\w\s 匹配第一個(gè)字符為數(shù)字,第二個(gè)字符為字母或數(shù)字、或下劃線或漢字,第三字符為空格的字符串 例如:11 ,2a , 1_
(3)^\d\d\d$ 匹配三個(gè)全部都為數(shù)字的字符串 例如: 123,456,789
還可以用于驗(yàn)證輸入的字符串是否符合qq(身份證號)的驗(yàn)證 : 例如:^\d{8}$ 匹配8位數(shù)字的qq號,^\d{15}&匹配15位均為數(shù)字的身份證號
(4)\bOlive\b 匹配單詞Olive 例如: I Love Oliver and Olive .這個(gè)時(shí)候返回的是Olive 而不是Oliver,因?yàn)閈b…\b返回的匹配的單詞
【9】分析一個(gè)匹配郵箱的正則表達(dá)式
var str = "abcd test@runoob.com 1234";
var patt1 = /\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b/g;
document.write(str.match(patt1));
【五】運(yùn)算符優(yōu)先級
正則表達(dá)式從左到右進(jìn)行計(jì)算,并遵循優(yōu)先級順序,這與算術(shù)表達(dá)式非常類似。
相同優(yōu)先級的從左到右進(jìn)行運(yùn)算,不同優(yōu)先級的運(yùn)算先高后低。下表從最高到最低說明了各種正則表達(dá)式運(yùn)算符的優(yōu)先級順序:
(1)\:轉(zhuǎn)義符
(2)(), (?:), (?=), []:圓括號和方括號
(3)*, +, ?, {n}, {n,}, {n,m}:限定符
(4)^, $, \任何元字符、任何字符:定位點(diǎn)和序列(即:位置和順序)
(5)|:替換,"或"操作
字符具有高于替換運(yùn)算符的優(yōu)先級,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",請使用括號創(chuàng)建子表達(dá)式,從而產(chǎn)生"(m|f)ood"。
【六】匹配規(guī)則
【1】基本模式匹配
一切從最基本的開始。模式,是正則表達(dá)式最基本的元素,它們是一組描述字符串特征的字符。模式可以很簡單,由普通的字符串組成,也可以非常復(fù)雜,往往用特殊的字符表示一個(gè)范圍內(nèi)的字符、重復(fù)出現(xiàn),或表示上下文。例如:
^once
這個(gè)模式包含一個(gè)特殊的字符 ^,表示該模式只匹配那些以 once 開頭的字符串。例如該模式與字符串 “once upon a time” 匹配,與 “There once was a man from NewYork” 不匹配。正如如 ^ 符號表示開頭一樣,$ 符號用來匹配那些以給定模式結(jié)尾的字符串。
bucket$
這個(gè)模式與 “Who kept all of this cash in a bucket” 匹配,與 “buckets” 不匹配。字符 ^ 和 $ 同時(shí)使用時(shí),表示精確匹配(字符串與模式一樣)。例如:
^bucket$
只匹配字符串 “bucket”。如果一個(gè)模式不包括 ^ 和 $,那么它與任何包含該模式的字符串匹配。例如模式:
once
與字符串
There once was a man from NewYork
Who kept all of his cash in a bucket.
是匹配的。
在該模式中的字母 (o-n-c-e) 是字面的字符,也就是說,他們表示該字母本身,數(shù)字也是一樣的。其他一些稍微復(fù)雜的字符,如標(biāo)點(diǎn)符號和白字符(空格、制表符等),要用到轉(zhuǎn)義序列。所有的轉(zhuǎn)義序列都用反斜杠 \ 打頭。制表符的轉(zhuǎn)義序列是 \t。所以如果我們要檢測一個(gè)字符串是否以制表符開頭,可以用這個(gè)模式:
^\t
類似的,用 \n 表示"新行",\r 表示回車。其他的特殊符號,可以用在前面加上反斜杠,如反斜杠本身用 \ 表示,句號 . 用 . 表示,以此類推。
【2】字符簇
在 INTERNET 的程序中,正則表達(dá)式通常用來驗(yàn)證用戶的輸入。當(dāng)用戶提交一個(gè) FORM 以后,要判斷輸入的電話號碼、地址、EMAIL 地址、信用卡號碼等是否有效,用普通的基于字面的字符是不夠的。
所以要用一種更自由的描述我們要的模式的辦法,它就是字符簇。要建立一個(gè)表示所有元音字符的字符簇,就把所有的元音字符放在一個(gè)方括號里:
[AaEeIiOoUu]
這個(gè)模式與任何元音字符匹配,但只能表示一個(gè)字符。用連字號可以表示一個(gè)字符的范圍,如:
[a-z] // 匹配所有的小寫字母
[A-Z] // 匹配所有的大寫字母
[a-zA-Z] // 匹配所有的字母
[0-9] // 匹配所有的數(shù)字
[0-9\.\-] // 匹配所有的數(shù)字,句號和減號
[ \f\r\t\n] // 匹配所有的白字符
同樣的,這些也只表示一個(gè)字符,這是一個(gè)非常重要的。如果要匹配一個(gè)由一個(gè)小寫字母和一位數(shù)字組成的字符串,比如 “z2”、“t6” 或 “g7”,但不是 “ab2”、“r2d3” 或 “b52” 的話,用這個(gè)模式:
^[a-z][0-9]$
盡管 [a-z] 代表 26 個(gè)字母的范圍,但在這里它只能與第一個(gè)字符是小寫字母的字符串匹配。
前面曾經(jīng)提到^表示字符串的開頭,但它還有另外一個(gè)含義。當(dāng)在一組方括號里使用 ^ 時(shí),它表示"非"或"排除"的意思,常常用來剔除某個(gè)字符。還用前面的例子,我們要求第一個(gè)字符不能是數(shù)字:
^[^0-9][0-9]$
這個(gè)模式與 “&5”、“g7"及”-2" 是匹配的,但與 “12”、“66” 是不匹配的。下面是幾個(gè)排除特定字符的例子:
[^a-z] //除了小寫字母以外的所有字符
[^\\\/\^] //除了(\)(/)(^)之外的所有字符
[^\"\'] //除了雙引號(")和單引號(')之外的所有字符
特殊字符 .(點(diǎn),句號)在正則表達(dá)式中用來表示除了"新行"之外的所有字符。所以模式 ^.5$ 與任何兩個(gè)字符的、以數(shù)字5結(jié)尾和以其他非"新行"字符開頭的字符串匹配。模式 . 可以匹配任何字符串,換行符(\n、\r)除外。
【3】確定重復(fù)出現(xiàn)
到現(xiàn)在為止,你已經(jīng)知道如何去匹配一個(gè)字母或數(shù)字,但更多的情況下,可能要匹配一個(gè)單詞或一組數(shù)字。一個(gè)單詞有若干個(gè)字母組成,一組數(shù)字有若干個(gè)單數(shù)組成。跟在字符或字符簇后面的花括號({})用來確定前面的內(nèi)容的重復(fù)出現(xiàn)的次數(shù)。
(1)^[a-zA-Z_]$:所有的字母和下劃線
(2)^[[:alpha:]]{3}$:所有的3個(gè)字母的單詞
(3)^a$:字母a
(4)^a{4}$:aaaa
(5)^a{2,4}$:aa,aaa或aaaa
(6)^a{1,3}$:a,aa或aaa
(7)^a{2,}$:包含多于兩個(gè)a的字符串
(8)^a{2,}:如:aardvark和aaab,但apple不行
(9)a{2,}:如:baad和aaa,但Nantucket不行
(10)\t{2}:兩個(gè)制表符
(11).{2}:所有的兩個(gè)字符
這些例子描述了花括號的三種不同的用法。一個(gè)數(shù)字 {x} 的意思是前面的字符或字符簇只出現(xiàn)x次 ;一個(gè)數(shù)字加逗號 {x,} 的意思是前面的內(nèi)容出現(xiàn)x或更多的次數(shù) ;兩個(gè)數(shù)字用逗號分隔的數(shù)字 {x,y} 表示 前面的內(nèi)容至少出現(xiàn)x次,但不超過y次。我們可以把模式擴(kuò)展到更多的單詞或數(shù)字:
^[a-zA-Z0-9_]{1,}$ // 所有包含一個(gè)以上的字母、數(shù)字或下劃線的字符串
^[1-9][0-9]{0,}$ // 所有的正整數(shù)
^\-{0,1}[0-9]{1,}$ // 所有的整數(shù)
^[-]?[0-9]+\.?[0-9]+$ // 所有的浮點(diǎn)數(shù)
最后一個(gè)例子,以一個(gè)可選的負(fù)號 ([-]?) 開頭 (^)、跟著1個(gè)或更多的數(shù)字([0-9]+)、和一個(gè)小數(shù)點(diǎn)(.)再跟上1個(gè)或多個(gè)數(shù)字([0-9]+),并且后面沒有其他任何東西($)。下面你將知道能夠使用的更為簡單的方法。
特殊字符 ? 與 {0,1} 是相等的,它們都代表著: 0個(gè)或1個(gè)前面的內(nèi)容 或 前面的內(nèi)容是可選的 。所以剛才的例子可以簡化為:
^\-?[0-9]{1,}\.?[0-9]{1,}$
特殊字符 * 與 {0,} 是相等的,它們都代表著 0 個(gè)或多個(gè)前面的內(nèi)容 。最后,字符 + 與 {1,} 是相等的,表示 1 個(gè)或多個(gè)前面的內(nèi)容 ,所以上面的4個(gè)例子可以寫成:
^[a-zA-Z0-9_]+$ // 所有包含一個(gè)以上的字母、數(shù)字或下劃線的字符串
^[1-9][0-9]*$ // 所有的正整數(shù)
^\-?[0-9]+$ // 所有的整數(shù)
^[-]?[0-9]+(\.[0-9]+)?$ // 所有的浮點(diǎn)數(shù)
【二】反義字符
(1)常用的反義字符
反義字符:多用于查找除某個(gè)字符以外其他任意字符均可以的情況
\W 匹配任意不是字母,數(shù)字,下劃線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數(shù)字的字符
\B 匹配不是單詞開頭或結(jié)束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個(gè)字母以外的任意字符
(2)詳解和示例
(1)\W 匹配除字母、數(shù)字、下劃線、漢字以為的字符形如 +,-,*
(2)\S 匹配除空格以外的任意字符形如:1,* ,)
(3)[^abcde] 匹配除abcde以為的其他字符 如 e,f,g,h
【三】限定字符
(1)常用的限定符
限定字符多用于重復(fù)匹配次數(shù)
* 重復(fù)零次或更多次
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次
(2)詳解和示例
(1)\d* 匹配重復(fù)0次或多次數(shù)字 例如:可能為空 或 任意數(shù)字 (2,3。。。。)
(2)\d+ 匹配重復(fù)1次或多次數(shù)字 例如:可能為1個(gè)或多個(gè)數(shù)字 1,23,234,2345,…
(3)\d? 匹配重復(fù)次個(gè)或者一次數(shù)字 例如:可能為空或者任意的一個(gè)數(shù)字(1,2,。。。)
(4)\d{8}匹配重復(fù)8次數(shù)字 例如:123456768
(5)\d{4,}匹配重復(fù)至少4次數(shù)字 例如:1234,12345,124244,。。。。。
(6)^\d{8,11}$ 匹配重復(fù)8-11次數(shù)字 例如:12345678,123456789,1234567890,12345678901
【四】轉(zhuǎn)義字符
在實(shí)際的開發(fā)中,可能會(huì)遇到要比配元字符的情況,這個(gè)時(shí)候就需要進(jìn)行字符轉(zhuǎn)義
如元字符 . * \ 需要轉(zhuǎn)換為\. \* \\
例如: 需要匹配qq郵箱 \d{8,}+qq+.+com 在這里的. 就需要加斜杠
例如:在使用split分割字符串的時(shí)候,如果是根據(jù)"."來分割的話,需要使用轉(zhuǎn)義字符
【五】字符分支
字符分枝多用于滿足不同情況的選擇,用“|”將不同的條件分割開來,比如有些固定電話區(qū)號有三位,有些有四位,這個(gè)時(shí)候可以采用字符分枝
例如:\d{3}-\d{8}|\d{4}-\d{8} 可以匹配兩種不同長度區(qū)號的固定電話
下邊的IP地址正則表達(dá)式也有用到字符分枝
【六】字符分組
字符分組多用于將多個(gè)字符重復(fù),主要通過使用小括號()來進(jìn)行分組
形如:(\d\w){3} 重復(fù)匹配3次(\d\w)
常用于表示IP地址 形如: ((25[0-5]|2[0-4][0-9]|[0-1]\d\d).){3}(25[0-5]|2[0-4][0-9]|[0-1]\d\d)
解析:先把IP地址分為兩部分一部分是123.123.123. 另一部分是123,又因Ip最大值為255,所以先使用分組,然后在組里邊再進(jìn)行選擇,組里也有三部分,0-199,200-249,250-255,分別和上述的表達(dá)是對應(yīng),最后還要注意分組之后還要加上一個(gè).,因?yàn)槭窃址砸D(zhuǎn)義故加上. 然后再把這部分整體看做是一個(gè)組,重復(fù)三次,再加上僅有數(shù)字的一組也就是不帶.的那一組即可完成IP地址的校驗(yàn)
常用分組語法
分類 代碼/語法 說明
捕獲 (exp) 匹配exp,并捕獲文本到自動(dòng)命名的組里
(?<name>exp) 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
零寬斷言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注釋 (?#comment) 這種類型的分組不對正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀
【七】懶惰匹配和貪婪匹配
貪婪匹配:正則表達(dá)式中包含重復(fù)的限定符時(shí),通常的行為是匹配盡可能多的字符。
懶惰匹配,有時(shí)候需要匹配盡可能少的字符。
例如: a.*b,它將會(huì)匹配最長的以a開始,以b結(jié)束的字符串。如果用它來搜索aabab的話,它會(huì)匹配整個(gè)字符串a(chǎn)abab。但是我們此時(shí)可能需要匹配的是ab這樣的話就需要用到懶惰匹配了。懶惰匹配會(huì)匹配盡可能少的字符
常用的懶惰匹配限定符如下
*? 重復(fù)任意次,但盡可能少重復(fù)
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上,但盡可能少重復(fù)
【八】后向引用
后向引用用于重復(fù)搜索前面某個(gè)分組匹配的文本。
使用小括號指定一個(gè)子表達(dá)式后,匹配這個(gè)子表達(dá)式的文本(也就是此分組捕獲的內(nèi)容)可以在表達(dá)式或其它程序中作進(jìn)一步的處理。默認(rèn)情況下,每個(gè)分組會(huì)自動(dòng)擁有一個(gè)組號,規(guī)則是:從左向右,以分組的左括號為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號為1,第二個(gè)為2,以此類推
示例:\b(\w+)\b\s+\1\b可以用來匹配重復(fù)的單詞,像go go, 或者kitty kitty。
這個(gè)表達(dá)式首先是一個(gè)單詞,也就是單詞開始處和結(jié)束處之間的多于一個(gè)的字母或數(shù)字(\b(\w+)\b),這個(gè)單詞會(huì)被捕獲到編號為1的分組中,然后是1個(gè)或幾個(gè)空白符(\s+),最后是分組1中捕獲的內(nèi)容(也就是前面匹配的那個(gè)單詞)(\1)。
你也可以自己指定子表達(dá)式的組名。要指定一個(gè)子表達(dá)式的組名,請使用這樣的語法:(?\w+)(或者把尖括號換成’也行:(?‘Word’\w+)),這樣就把\w+的組名指定為Word了。要反向引用這個(gè)分組捕獲的內(nèi)容,你可以使用\k,所以上一個(gè)例子也可以寫成這樣:\b(?\w+)\b\s+\k\b
【九】零寬斷言
有時(shí)候需要查找某些匹配之前或之后的東西,這個(gè)時(shí)候就需要用到們像\b,^,$那樣用于指定一個(gè)位置,這個(gè)位置應(yīng)該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言
(?=exp)也叫零寬度正預(yù)測先行斷言,它斷言自身出現(xiàn)的位置的后面能匹配表達(dá)式exp。比如\b\w+(?=ing\b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.時(shí),它會(huì)匹配sing和danc。
(?<=exp)也叫零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp。比如(?<=\bre)\w+\b會(huì)匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時(shí),它匹配ading。
【十】其他語法
(1).NET常用的處理選項(xiàng)
IgnoreCase(忽略大小寫) 匹配時(shí)不區(qū)分大小寫。
Multiline(多行模式) 更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個(gè)字符串的開頭和結(jié)尾匹配。(在此模式下,$的精確含意是:匹配\n之前的位置以及字符串結(jié)束前的位置.)
Singleline(單行模式) 更改.的含義,使它與每一個(gè)字符匹配(包括換行符\n)。
IgnorePatternWhitespace(忽略空白) 忽略表達(dá)式中的非轉(zhuǎn)義空白并啟用由#標(biāo)記的注釋。
ExplicitCapture(顯式捕獲) 僅捕獲已被顯式命名的組。
(2)其他語法
\a 報(bào)警字符(打印它的效果是電腦嘀一聲)
\b 通常是單詞分界位置,但如果在字符類里使用代表退格
\t 制表符,Tab
\r 回車
\v 豎向制表符
\f 換頁符
\n 換行符
\e Escape
\0nn ASCII代碼中八進(jìn)制代碼為nn的字符
\xnn ASCII代碼中十六進(jìn)制代碼為nn的字符
\unnnn Unicode代碼中十六進(jìn)制代碼為nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串開頭(類似^,但不受處理多行選項(xiàng)的影響)
\Z 字符串結(jié)尾或行尾(不受處理多行選項(xiàng)的影響)
\z 字符串結(jié)尾(類似$,但不受處理多行選項(xiàng)的影響)
\G 當(dāng)前搜索的開頭
\p{name} Unicode中命名為name的字符類,例如\p{IsGreek}
(?>exp) 貪婪子表達(dá)式
(?<x>-<y>exp) 平衡組
(?im-nsx:exp) 在子表達(dá)式exp中改變處理選項(xiàng)
(?im-nsx) 為表達(dá)式后面的部分改變處理選項(xiàng)
(?(exp)yes|no) 把exp當(dāng)作零寬正向先行斷言,如果在這個(gè)位置能匹配,使用yes作為此組的表達(dá)式;否則使用no
(?(exp)yes) 同上,只是使用空表達(dá)式作為no
(?(name)yes|no) 如果命名為name的組捕獲到了內(nèi)容,使用yes作為表達(dá)式;否則使用no
(?(name)yes) 同上,只是使用空表達(dá)式作為no
【十一】常用的實(shí)用正則表達(dá)式整理
(1)常用的正則表達(dá)式
只能輸入數(shù)字:"^[0-9]*$"。
只能輸入n位的數(shù)字:"^"d{n}$"。
只能輸入至少n位的數(shù)字:"^"d{n,}$"。
只能輸入m~n位的數(shù)字:。"^"d{m,n}$"
只能輸入零和非零開頭的數(shù)字:"^(0|[1-9][0-9]*)$"。
只能輸入有兩位小數(shù)的正實(shí)數(shù):"^[0-9]+(.[0-9]{2})?$"。
只能輸入有1~3位小數(shù)的正實(shí)數(shù):"^[0-9]+(.[0-9]{1,3})?$"。
只能輸入非零的正整數(shù):"^"+?[1-9][0-9]*$"。
只能輸入非零的負(fù)整數(shù):"^"-[1-9][]0-9"*$。
只能輸入長度為3的字符:"^.{3}$"。
只能輸入由26個(gè)英文字母組成的字符串:"^[A-Za-z]+$"。
只能輸入由26個(gè)大寫英文字母組成的字符串:"^[A-Z]+$"。
只能輸入由26個(gè)小寫英文字母組成的字符串:"^[a-z]+$"。
只能輸入由數(shù)字和26個(gè)英文字母組成的字符串:"^[A-Za-z0-9]+$"。
只能輸入由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串:"^"w+$"。
驗(yàn)證用戶密碼:"^[a-zA-Z]"w{5,17}$"正確格式為:以字母開頭,長度在6~18之間,只能包含字符、數(shù)字和下劃線。
驗(yàn)證是否含有^%&’,;=?$""等字符:"[^%&’,;=?$"x22]+"。
只能輸入漢字:"^["u4e00-"u9fa5]{0,}$"
驗(yàn)證Email地址:"/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/"。
驗(yàn)證InternetURL:"^http://(["w-]+".)+["w-]+(/["w-./?%&=]*)?$"。
驗(yàn)證電話號碼:"^("("d{3,4}-)|"d{3.4}-)?"d{7,8}$"正確格式為:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
驗(yàn)證身份證號(15位或18位數(shù)字):"^"d{15}|"d{18}$"。
驗(yàn)證一年的12個(gè)月:"^(0?[1-9]|1[0-2])$"正確格式為:"01"~"09"和"1"~"12"。
驗(yàn)證一個(gè)月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01"~"09"和"1"~"31"。
【十二】正則表達(dá)式案例分析
(1)給json字符串的key和value加上雙引號
(1)需求描述
原來的格式是:[{CODE:PDM_config10200,SYS:PDM}]
想要的格式是:[{“CODE”:“PDM_config10200”,“SYS”:“PDM”}]
(2)第一次實(shí)現(xiàn)的方式
實(shí)現(xiàn)的方式:jsonDependantJobs.replaceAll(“(\w+)\s*:\s*(\w+)”, “”$1":“$2"”)
細(xì)節(jié)分析:
\w:匹配字母、數(shù)字、下劃線。等價(jià)于 [A-Za-z0-9_]
+:匹配一個(gè)或者多個(gè)
\s:匹配任何空白字符,包括空格、制表符、換頁符等等。等價(jià)于 [
*:通配符匹配零個(gè)或多個(gè)字符
(3)出現(xiàn)問題
如果格式變成:[{CODE:PDATA.PDM_config10203,SYS:PDM}]
結(jié)果就會(huì)變成:[{“CODE”:“PDATA”.PDM_config10203,“SYS”:“PDM”}]文章來源:http://www.zghlxwxcb.cn/news/detail-554294.html
(4)第二次實(shí)現(xiàn)的方式
實(shí)現(xiàn)的方式:jsonDependantJobs.replaceAll(“(\w+)\s*:\s*(,|})”, “”$1":“$2"”)文章來源地址http://www.zghlxwxcb.cn/news/detail-554294.html
到了這里,關(guān)于正則表達(dá)式使用匯總的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!