亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

55分鐘學會正則表達式

2020-03-16 21:00:54
字體:
來源:轉載
供稿:網友
正則表達式是一種用來描述一定數量文本的模式,用來匹配相同規范樣式的文本。在JavaScript中用RegExp對象表示正則表達式( 即Regular Eexpression),它是對字符串執行模式匹配的強大工
 

什么是正則

正則表達式是一種用來描述一定數量文本的模式,用來匹配相同規范樣式的文本。在JavaScript中用RegExp對象表示正則表達式( 即Regular Eexpression),它是對字符串執行模式匹配的強大工具。

55分鐘學會正則表達式

正則表達式是一種查找以及字符串替換操作。正則表達式在文本編輯器中廣泛使用,比如正則表達式被用于:

檢查文本中是否含有指定的特征詞

找出文中匹配特征詞的位置

從文本中提取信息,比如:字符串的子串

修改文本

與文本編輯器相似,幾乎所有的高級編程語言都支持正則表達式。在這樣的語境下,“文本”也就是一個字符串,可以執行的操作都是類似的。一些編程語言(比如Perl,JavaScript)會檢查正則表達式的語法。

正則表達式是什么?

正則表達式只是一個字符串。沒有長度限制,但是,這樣的正則表達式長度往往較短。如下所示是一些正則表達式的例子:

I had a /S+ day today[A-Za-z0-9/-_]{3,16}/d/d/d/d-/d/d-/d/dv(/d+)(/./d+)*TotalMessages="(.*?)"<[^<>]>

這些字符串實際上都是微型計算機程序。正則表達式的語法,實際上是一種輕量級、簡潔、適用于特定領域的編程語言。記住這一點,那么你就很容易理解下面的事情:

每一個正則表達式,都可以分解為一個指令序列,比如“先找到這樣的字符,再找到那樣的字符,再從中找到一個字符。。。”

每一個正則表達式都有輸入(文本)和輸出(匹配規則的輸出,有時是修改后的文本)
正則表達式有可能出現語法錯誤——不是所有的字符串都是正則表達式

正則表達式語法很有個性,也可以說很恐怖

有時可以通過編譯,使得正則表達式執行更快
在實現中,正則表達式還有其他的特點。本文將重點討論正則表達式的核心語法,在幾乎所有的正則表達式中都可以見到這些規則。

特別提示:正則表達式與文件通配語法無關,比如 *.xml

正則表達式的基礎語法

字符

正則表達式中包含了一系列的字符,這些字符只能匹配它們本身。有一些被稱為“元字符”的特殊字符,可以匹配一些特殊規則。

如下所示的例子中,我用紅色標出了元字符。

I had a /S+ day today[A-Za-z0-9/-_]{3,16}/d/d/d/d-/d/d-/d/dv(/d+)(/./d+)*TotalMessages="(.*?)"<[^<>]*> 


大部分的字符,包括所有的字母和數字字符,是普通字符。也就意味著,它們只能匹配它們自己,如下所示的正則表達式:

cat

意味著,只能匹配一個字符串,以“c”開頭,然后是字符“a”,緊跟著是字符“t”的字符串。

到目前為止,正則表達式的功能類似于

常規的Find功能

Java中的 String.indexOf() 函數

PHP中的 strpos()函數
等等

注意:不做特殊說明,正則表達式中是區分大小寫的。但是,幾乎所有正則表達式的實現,都會提供一個Flag用來控制是否區分大小寫。

點“.”

我們第一個要講解的元字符是“.”。這個符號意味著可以匹配任意一個字符。如下所示的正則表達式:

c.t

意味著匹配“以c開頭,之后是任意一個字符,緊跟著是字母t”的字符串。

在一段文本中,這樣的正則表達式可以用來找出cat, cot, czt這樣的字符串,甚至可以找出c.t這樣的組合,但是不能找到ct或者是coot這樣的字符串。

使用反斜杠“/”可以忽略元字符,使得元字符的功能與普通字符一樣。所以,正則表達式

c/.t

表示“找到字母c,然后是一個句號(“.”),緊跟著字母t”

反斜杠本身也是一個元字符,這意味著反斜杠本身也可以通過相似的方法變回到普通字符的用途。因此,正則表達式

c//t

表示匹配“以字符c開頭,然后是一個反斜杠,緊跟著是字母t”的字符串。

注意!在正則表達式的實現中,.是不能用于匹配換行符的。”換行符“的表示方法在不同實現中也不同。實際編程時,請參考相關文檔。在本文中,我認為.是可以匹配任意字符的。實現環境通常會提供一個Flag標志位,來控制這一點。

字符類

字符類是一組在方括號內的字符,表示可以匹配其中的任何一個字符。

正則表達式c[aeiou]t,表示可以匹配的字符串是”以c開頭,接著是aeiou中的任何一個字符,最后以t結尾”。在文本的實際應用中,這樣的正則表達式可以匹配:cat,cet,cit,cot,cut五種字符串。

正則表達式[0123456789]表示匹配任意一個整數。

正則表達式[a]表示匹配單字符a。

包含忽略字符的例子

[Math Processing Error]表示匹配字符串[a]
[/[/]/ab]表示匹配的字符為”["或者'']”或者”a”,或者”b”
[///[/]]表示匹配的字符為”/”或者 “[”或者"]“

在字符類中,字符的重復和出現順序并不重要。[dabaaabcc]與[abc]是相同的

重要提示:字符類中和字符類外的規則有時不同,一些字符在字符類中是元字符,在字符類外是普通字符。一些字符正好相反。還有一些字符在字符類中和字符類外都是元字符,這要視情況而定!

比如,.表示匹配任意一個字符,而[.]表示匹配一個全角句號。這不是一回事!

字符類的范圍

在字符集中,你可以通過使用短橫線來表示匹配字母或數字的范圍。

[b-f]與[b,c,d,e,f]相同,都是匹配一個字符”b”或”c”或”d”或”e”或”f”

[A-Z]與[ABCDEFGHIJKLMNOPQRSTUVWXYZ]相同,都是匹配任意一個大寫字母。

[1-9]與[123456789]相同,都是匹配任意一個非零數字。

練習

使用目前我們已經講解的正則表達式相關知識,在字典中匹配找到含有最多連續元音的單詞,同時找到含有最多連續輔音的單詞。

答案

[aeiou][aeiou][aeiou][aeiou][aeiou][aeiou] 這樣的正則表達式,可以匹配連續含有六個元音的單詞,比如 euouae 和 euouaes。

同樣的,恐怖的正則表達式[bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz] 可以找到連續含有十個輔音的單詞sulphhydryls.

下文中,我們會講解,怎樣有效縮短這樣的正則表達式長度。

在字符類之外,短橫線沒有特殊含義。正則表達式a-z,表示匹配字符串“以a開頭,然后是一個短橫線,以z結尾”。

范圍和單獨的字符可能在一個字符類中同時出現:

[0-9.,]表明匹配一個數字,或者一個全角句號,或者一個逗號

[0-9a-fA-F]意味著匹配一個十六進制數

[a-zA-Z0-9/-]意味著匹配一個字母、數字或者一個短橫線
練習

使用已經介紹過的正則表達式知識,匹配YYYY-MM-DD格式的日期。

答案

[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].

同樣的,下文中,我們會介紹怎樣有效減少這樣的正則表達式長度。

雖然你可以嘗試在正則表達式中使用一些非字母或數字作為范圍的最后一個符號,比如abc[!-/]def,但是這并不是在每種實現中都合法。即使這樣的語法是合法的,這樣的語義也是模糊的。最好不要這樣使用。

同時,你必須謹慎選擇范圍的邊界值。即使[A-z]在你使用的實現中,是合法的,也可能會產生無法預料的運行結果。(注意,在z到a之間,是有字符存在的)

注意:范圍的字符值代表的是字符而已,并不能代表數值范圍,比如[1-31]表示匹配一個數字,是1或者2或者3,而不是匹配一個數值在1到31之間的數。

字符類的反義

你可以在字符類的起始位放一個反義符。

[^a]表示匹配任何不是“a”的字符
[^a-zA-Z0-9]表示匹配任何不是字母也不是數字的字符
[/^abc]匹配一個為“^”或者a或者b或者c的字符
[^/^]表示匹配任何不為“^”的字符

練習

在字典中,找到一個不滿足“在e之前有i,但是沒有c”的例子。

答案

cie和[^c]ei都要可以找到很多這樣的例子,比如ancient,science,viel,weigh

轉義字符類

/d這個正則表達式與[0-9]作用相同,都是匹配任何一個數字。(要匹配/d,應該使用正則表達式//d)

/w與[0-9A-Za-z]相同,都表示匹配一個數字或字母字符

/s意味著匹配一個空字符(空格,制表符,回車或者換行)

另外

/D與[^0-9]相同,表示匹配一個非數字字符。

/W與[^0-9A-Za-z]相同,表示匹配一個非數字同時不是字母的字符。

/S表示匹配一個非空字符。

這些是你必須掌握的字符。你可能已經注意到了,一個全角句號“.”也是一個字符類,可以匹配任意一個字符。

很多正則表達式的實現中,提供了更多的字符類,或者是標志位在ASCII碼的基礎上,擴展現有的字符類。

特別提示:統一字符集中包含除了0至9之外的更多數字字符,同樣的,也包含更多的空字符和字母字符。實際使用正則表達式時,請仔細查看相關文檔。

練習

簡化正則表達式 [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].

答案

/d/d/d/d-/d/d-/d/d.

重復

在字符或字符集之后,你可以使用{ }大括號來表示重復

正則表達式a{1}與a意思相同,都表示匹配字母a

a{3}表示匹配字符串“aaa”

a{0}表示匹配空字符串。從這個正則表達式本身來看,它毫無意義。如果你對任何文本執行這樣的正則表達式,你可以定位到搜索的起始位置,即使文本為空。

a/{2/}表示匹配字符串“a{2}”

在字符類中,大括號沒有特殊含義。[{}]表示匹配一個左邊的大括號,或者一個右邊的大括號

練習

簡化下面的正則表達式

z.......z
/d/d/d/d-/d/d-/d/d
[aeiou][aeiou][aeiou][aeiou][aeiou][aeiou]
[bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz]

答案

z.{7}z
/d{4}-/d{2}-/d{2}
[aeiou]{6}
[bcdfghjklmnpqrstvwxyz]{10}

注意:重復字符是沒有記憶性的,比如[abc]{2}表示先匹配”a或者b或者c”,再匹配”a或者b或者c”,與匹配”aa或者ab或者ac或者ba或者bb或者bc或者ca或者cb或者cc“一樣。[abc]{2}并不能表示匹配”aa或者bb或者cc“

指定重復次數范圍

重復次數是可以指定范圍的

x{4,4}與x{4}相同

colou{0,1}r表示匹配colour或者color

a{3,5}表示匹配aaaaa或者aaaa或者aaa
注意這樣的正則表達式會優先匹配最長字符串,比如輸入 I had an aaaaawful day會匹配單詞aaaaawful中的aaaaa,而不會匹配其中的aaa。

重復次數是可以有范圍的,但是有時候這樣的方法也不能找到最佳答案。如果你的輸入文本是I had an aaawful daaaaay那么在第一次匹配時,只能找到aaawful,只有再次執行匹配時才能找到daaaaay中的aaaaa.

重復次數的范圍可以是開區間

a{1,}表示匹配一個或一個以上的連續字符a。依然是匹配最長字符串。當找到第一個a之后,正則表達式會嘗試匹配盡量多個的連續字母a。

.{0,}表示匹配任意內容。無論你輸入的文本是什么,即使是一個空字符串,這個正則表達式都會成功匹配全文并返回結果。
練習

使用正則表達式找到雙引號。要求輸入字符串可能包含任意個字符。

調整你的正則表達式使得在一對雙引號中間不再包含其他的雙引號。

答案

".{0,}", 然后 "[^"]{0,}".

關于重復的轉義字符

?與{0,1}相同,比如,colou?r表示匹配colour或者color

*與{0,}相同。比如,.*表示匹配任意內容

+與{1,}相同。比如,/w+表示匹配一個詞。其中”一個詞”表示由一個或一個以上的字符組成的字符串,比如_var或者AccountName1.

這些是你必須知道的常用轉義字符,除此之外還有:

/?/*/+ 表示匹配字符串”?*+”
[?*+]表示匹配一個問號,或者一個*號,或者一個加號
練習

簡化下列的正則表達式:

".{0,}" and "[^"]{0,}"
x?x?x?
y*y*
z+z+z+z+
答案

".*" and "[^"]*"
x{0,3}
y*
z{4,}

練習

寫出正則表達式,尋找由非字母字符分隔的兩個單詞。如果是三個呢?六個呢?

/w+/W+/w+, /w+/W+/w+/W+/w+, /w+/W+/w+/W+/w+/W+/w+/W+/w+/W+/w+.

下文中,我們將簡化這個正則表達式。

非貪婪匹配

正則表達式 “.*” 表示匹配雙引號,之后是任意內容,之后再匹配一個雙引號。注意,其中匹配任意內容也可以是雙引號。通常情況下,這并不是很有用。通過在句尾加上一個問號,可以使得字符串重復不再匹配最長字符。

/d{4,5}?表示匹配/d/d/d/d或者/d/d/d/d/d。也就是和/d{4}一樣
colou??r與colou{0,1}r相同,表示找到color或者colour。這與colou?r一樣。
“.*?”表示先匹配一個雙引號,然后匹配最少的字符,然后是一個雙引號,與上面兩個例子不同,這很有用。

選擇匹配

你可以使用|來分隔可以匹配的不同選擇:

cat|dog表示匹配”cat”或者”dog”
red|blue|以及red||blue以及|red|blue都表示匹配red或者blue或者一個空字符串
a|b|c與[abc]相同
cat|dog|/|表示匹配”cat”或者”dog”或者一個分隔符”|“
[cat|dog]表示匹配a或者c或者d或者g或者o或者t或者一個分隔符“|”
練習

簡化下列正則表達式:

s|t|u|v|w
aa|ab|ba|bb
[abc]|[^abc]
[^ab]|[^bc]
[ab][ab][ab]?[ab]?
答案

[s-w]
[ab]{2}
.
[^b]
[ab]{2,4}
練習

使用正則表達式匹配1到31之間的整數,[1-31]不是正確答案!

這樣的正則表達式不唯一. [1-9]|[12][0-9]|3[01] 是其中之一。

分組

你可以使用括號表示分組:

通過使用 Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day 匹配一周中的某一天
(/w*)ility 與 /w*ility 相同。都是匹配一個由”ility”結尾的單詞。稍后我們會講解,為何第一種方法更加有用。
[Math Processing Error]表示匹配一對括號。
[()]表示匹配任意一個左括號或者一個右括號
練習

在《時間機器中》找到一對括號中的內容,然后通過修改正則表達式,找到不含括號的內容。

答案

[Math Processing Error]. 然后是, [Math Processing Error].

分組可以包括空字符串:

(red|blue)表示匹配red或者blue或者是一個空字符串
abc()def與abcdef相同
你也可以在分組的基礎上使用重復:

(red|blue)?與(red|blue|)相同
/w+(/s+/w+)表示匹配一個或多個由空格分隔的單詞
練習

簡化正則表達式 /w+/W+/w+/W+/w+ 以及 /w+/W+/w+/W+/w+/W+/w+/W+/w+/W+/w+.

答案

/w+(/W+/w+){2}, /w+(/W+/w+){5}.

 

單詞分隔符

在單詞和非單詞之間有單詞分隔符。記住,一個單詞/w是[0-9A-Za-z_],而非單詞字符是/W(大寫),表示[^0-9A-Za-z_].

在文本的開頭和結尾通常也有單詞分隔符。

在輸入文本it's a cat中,實際有八個單詞分隔符。如果我們在cat之后在上一個空格,那就有九個單詞分隔符。.

/b表示匹配一個單詞分隔符
/b/w/w/w/b表示匹配一個三字母單詞
a/ba表示匹配兩個a中間有一個單詞分隔符。這個正則表達式永遠不會有匹配的字符,無論輸入怎樣的文本。
單詞分隔符本身并不是字符。它們的寬度為0。下列正則表達式的作用不同

(/bcat)/b
(/bcat/b)
/b(cat)/b
/b(cat/b)
練習

在詞典中找到最長的單詞。

答案

在嘗試之后發現,/b.{45,}/b可以在字典中找到最長單詞

 

換行符

一篇文本中可以有一行或多行,行與行之間由換行符分隔,比如:

Line一行文字
Line break換行符
Line一行文字
Line break換行符

Line break換行符
Line一行文字
注意,所有的文本都是以一行結束的,而不是以換行符結束。但是,任意一行都可能為空,包括最后一行。

行的起始位置,是在換行符和下一行首字符之間的空間??紤]到單詞分隔符,文本的起始位置也可以當做是首行位置。

最后一行是最后一行的尾字符和換行符之間的空間??紤]到單詞分隔符,文本的結束也可以認為是行的結束。

那么新的格式表示如下:

Start-of-line, line, end-of-line
Line break
Start-of-line, line, end-of-line
Line break

Line break
Start-of-line, line, end-of-line

基于上述概念:

^表示匹配行的開始位置
$表示匹配行的結束位置
^&表示一個空行
^.*& 表示匹配全文內容,因為行的開始符號也是一個字符,"."會匹配這個符號。找到單獨的一行,可以使用 ^.*?$
/^/$表示匹配字符串“^$”
[$]表示匹配一個$。但是,[^]不是合法的正則表達式。記住在方括號中,字符有不同的特殊含義。要想在方括號內匹配^,必須用[/^]
與字符分隔符一樣,換行符也不是字符。它們寬度為0.如下所示的正則表達式作用不同:

(^cat)$
(^cat$)
^(cat)$
^(cat$)
練習

使用正則表達式在《時間機器》中找到最長的一行。

答案

使用正則表達式^.{73,}$可以匹配長度為73的一行

文本分界

在很多的正則表達式實現中,將^和$作為文本的開始符號和結束符號。

還有一些實現中,用/A和/z作為文本的開始和結束符號。

捕捉和替換

從這里開始,正則表達式真正體現出了它的強大。

捕獲組

你已經知道了使用括號可以匹配一組符號。使用括號也可以捕獲子串。假設正則表達式是一個小型計算機程序,那么捕獲子串就是它輸出的一部分。

正則表達式(/w*)ility表示匹配以ility結尾的詞。第一個被捕獲的部分是由/w*控制的。比如,輸入的文本內容中有單詞accessibility,那么首先被捕獲的部分是accessib。如果輸入的文本中有單獨的ility,則首先被捕獲的是一個空字符串。

你可能會有很多的捕獲字符串,它們可能靠得很近。捕獲組從左向右編號。也就是只需要對左括號計數。

假設有這樣的正則表達式:(/w+) had a ((/w+) /w+)

輸入的內容是:I had a nice day

捕獲組1:I
捕獲組2:nice day
捕獲組3:nice
在一些正則表達式的實現中,你可以從零開始編號,編號零表示匹配整句話:I had a nice day.

在其他的實現中,如果沒有制定捕獲組,那么捕獲組1會自動地填入捕獲組0的信息。

是的,這也意味著會有很多的括號。有一些正則表達式的實現中,提供了“非捕獲組”的語法,但是這樣的語法并不是標準語法,因此我們不會介紹。

從一個成功的匹配中返回的捕獲組個數,與使用原來的正則表達式獲得的捕獲組個數相同。記住這一點,你可以解釋一些奇怪的現象。.

正則表達式((cat)|dog)表示匹配cat或者dog。這里有兩個捕獲組,如果輸入文本是dog,那么捕獲組1是dog,捕獲組2為空。

正則表達式a(/w)*表示匹配一個以a開頭的單詞。這里只有一個捕獲組

如果輸入文本為a,捕獲組1為空。
如果輸入文本為ad,捕獲組為d
如果輸入文本為avocado,捕獲組1為v。但是捕獲組0表示整個單詞avocado.
替換

假如你使用了一個正則表達式去匹配字符串,你可以描述另外一個字符串來替換其中的匹配字符。用來替換的字符串稱為替換表達式。它的功能類似于

常規的Replace會話
Java中的String.replace()函數
PHP的str_replace()函數
等等
練習

將《時間機器》中所有的元音字母替換為r。

答案

使用正則表達式[aeiou]以及[AEIOU],對應的替換字符串分別為r,R.

但是,你可以在替換表達式中引用捕獲組。這是在替換表達式中,你可以唯一操作的地方。這也是非常有效的,因為這樣你就不用重構你找到的字符串。

假設你正在嘗試將美國風格的日期表示MM/DD/YY替換為ISO 8601日期表示YYYY-MM-DD

從正則表達式(/d/d)/(/d/d)/(/d/d)開始。注意,這其中有三個捕獲組:月份,日期和兩位的年份。
.捕獲組的內容和捕獲組編號之間用反斜杠分隔,因此你的替換表達式應該是20/3-/1-/2.
如果我們輸入的文本中包含03/04/05表示2005年3月4日那么:
捕獲組1:03
捕獲組2:04
捕獲組3:05
替換字符串2005-03-04.
在替換表達式中,你可以多次使用捕獲組

對于雙元音,正則表達式為([aeiou]),替換表達式為/l/l
在替換表達式中不能使用反斜杠。比如,你在計算機程序中希望使用字符串中使用部分文本。那么,你必須在每個雙引號或者反斜杠之前加上反斜杠。
你的正則表達式可以是([//"])。捕獲組1是雙引號或者反斜杠
你的替換表達式應該是///l
在某些實現中,采用美元符號$代替/

練習

使用正則表達式和替換表達式,將23h59這樣的時間戳轉化為23:59.

答案

正則表達式finds the timestamps, 替換表達式/1:/2

反向引用

在一個正則表達式中,你也可以引用捕獲組。這稱作:反向引用

比如,[abc]{2}表示匹配aa或者ab或者ac或者ba或者bb或者bc或者ca或者cb或者cc.但是{[abc]}/1表示只匹配aa或者bb或者cc.

練習

在字典中,找到包含兩次重復子串的最長單詞,比如papa, coco

/b(.{6,})/1/b 匹配 chiquichiqui.

如果我們不在乎單詞的完整性,我們可以忽略單詞的分解,使用正則表達式 (.{7,})/1匹配countercountermeasure 以及 countercountermeasures.

使用正則表達式編程

特別提醒:

過度使用的反斜杠

在一些編程語言,比如Java中,對于包含正則表達式的字符串沒有特殊標記。字符串有著自己的過濾規則,這是優先于正則表達式規則的,這是頻繁使用反斜杠的原因。

比如在Java中

匹配一個數字,使用的正則表達式從/d變為代碼中的String re= “//d”
匹配雙引號字符串的正則表達式從"[^"]*" 變為String re = “/”[^/"]*/”"
匹配反斜杠或者是左邊方括號,或者右邊方括號的正則表達式從[///[/]] 變為String re = “[/////
[Math Processing Error]]”;
String re = "//s"; 和String re = "[ /t/r/n]"; 是等價的. 注意它們實際執行調用時的層次不同。
在其他的編程語言中,正則表達式是由特殊標明的,比如使用/。下面是JavaScript的例子:

匹配一個數字,/d會簡單寫成 var regExp = //d/;.
匹配一個反斜杠或者一個左邊的方括號或者一個右邊的方括號, var regExp = /[///[/]]/;
var regExp = //s/; 和 var regExp = /[ /t/r/n]/; 是等價的
當然,這意味著在使用/時必須重復兩次。比如找到URL必須使用var regExp = /https?://///;.
我希望現在你能明白,我為什么讓你特別注意反斜杠。

動態正則表達式

當你動態創建一個正則表達式的時候請特別小心。如果你使用的字符串不夠完善的花,可能會有意想不到的匹配結果。這可能導致語法錯誤,更糟糕的是,你的正則表達式語法正確,但是結果無法預料。

錯誤的Java代碼:

String sep = System.getProperty(“file.separator”); String[] directories = filePath.split(sep);

Bug:String.split() 認為sep是一個正則表達式。但是,在Windows中,Sep是表示匹配一個反斜杠,也就是與正則表達式”//”相同。這個正則表達式是正確的,但是會返回一個異常:PatternSyntaxException.

任何好的編程語言都會提供一種良好的機制來跳過字符串中所有的元字符。在Java中,你可以這樣實現:

String sep = System.getProperty(“file.separator”);

String[] directories = filePath.split(Pattern.quote(sep));

循環中的正則表達式

將正則表達式字符串加入反復運行的程序中,是一種開銷很大的操作。如果你可以在循環中避免使用正則表達式,你可以大大提高效率。

其他建議

輸入驗證

正則表達式可以用來進行輸入驗證。但是嚴格的輸入驗證會使得用戶體驗較差。比如:
信用卡號

在一個網站上,我輸入了我的卡號比如 1234 5678 8765 4321 網站拒絕接收。因為它使用了正則表達式/d{16}。

正則表達式應該考慮到用戶輸入的空格和短橫線。

實際上,為什么不先過濾掉所有的非數字字符,然后再進行有效性驗證呢?這樣做,可以先使用/D以及空的替換表達式。

練習

在不先過濾掉所有的非數字字符的情況下,使用正則表達式驗證卡號的正確性。

答案

/D*(/d/D*){16} is one of several variations which would accomplish this.

名字

不要使用正則表達式來驗證姓名。實際上,即使可以,也不要企圖驗證姓名。

程序員對名字的錯誤看法:

名字中不含空格
名字中沒有連接符號
名字中只會使用ASCII碼字符
名字中出現的字都在特殊字符集中
名字至少要有M個字的長度
名字不會超過N個字的長度
人們只有一個名
人們只有一個中間名
人們只有一個姓(最后三條是從英語的人名考慮)
電子郵件地址

不要使用正則表達式驗證郵箱地址的正確性。

首先,這樣的驗證很難是精確的。電子郵件地址是可以用正則表達式驗證的,但是表達式會非常的長并且復雜。

短的正則表達式會導致錯誤。(你知道嗎?電子郵箱地址中會有一些注釋)

第二,即使一個電子郵件地址可以成功匹配正則表達式,也不代表這個郵箱實際存在。郵箱的唯一驗證方法,是發送驗證郵件。

注意

在嚴格的應用場景中,不要使用正則表達式來解析HTML或者XML。解析HTML或者XML:

使用簡單的正則表達式不能完成
總體來說非常困難
已經有其他的方法解決
找到一個已經有的解析庫來完成這個工作

這就是55分鐘的全部內容

總結:

字符: a b c d 1 2 3 4 etc.
字符類: . [abc] [a-z] /d /w /s
. 代表任何字符
/d 表示“數字”
/w 表示”字母”, [0-9A-Za-z_]
/s 表示 “空格, 制表符,回車或換行符”
否定字符類: [^abc] /D /W /S
重復: {4} {3,16} {1,} ? * +
? 表示 “零次或一次”
* 表示 “大于零次”
+ 表示 “一次或一次以上”
如果不加上?,所有的重復都是最長匹配的(貪婪)
分組: (Septem|Octo|Novem|Decem)ber
詞,行以及文本的分隔: /b ^ $ /A /z
轉義字符: /1 /2 /3 etc. (在匹配表達式和替換表達式中都可用)
元字符: . / [ ] { } ? * + | ( ) ^ $
在字符類中使用元字符: [ ] / - ^
使用反斜杠可以忽略元字符: /
致謝

正則表達式非常常用而且非常有用。每個人在編輯文本或是編寫程序時都必須了解怎樣使用正則表達式。



注:相關教程知識閱讀請移步到正則表達式頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久国产精品99gif| 日韩视频免费中文字幕| 亚洲最大的av网站| 国产午夜一区二区| 一区二区三区黄色| 欧美精品激情在线| 亚洲视频在线观看| 国产欧美va欧美va香蕉在| 亚洲欧洲国产伦综合| 国产日韩在线视频| 国产综合色香蕉精品| 久久99精品久久久久久青青91| 亚洲综合中文字幕68页| 亚洲色图35p| 国产日韩欧美在线视频观看| 国产精品久久久久7777婷婷| 伦理中文字幕亚洲| 国产色视频一区| 久久久久久久久中文字幕| 国产精品免费一区二区三区都可以| 国产成人精品a视频一区www| 亚洲www在线观看| 亚洲自拍小视频| 亚洲白拍色综合图区| 亚洲老板91色精品久久| 久久久久亚洲精品成人网小说| 亚洲第一精品久久忘忧草社区| 亚洲自拍欧美色图| 黑人巨大精品欧美一区二区一视频| 亚洲精品福利在线| 庆余年2免费日韩剧观看大牛| 国产精品黄页免费高清在线观看| 久久精品在线播放| 91精品国产综合久久香蕉的用户体验| 亚洲日本欧美中文幕| 国产大片精品免费永久看nba| 激情成人中文字幕| 国产成人综合一区二区三区| 亚洲xxxxx| 久热国产精品视频| 亚洲性线免费观看视频成熟| 亚洲美女黄色片| 在线视频欧美日韩精品| 国产欧美精品一区二区三区介绍| 国产精品日日摸夜夜添夜夜av| 成人av资源在线播放| 国产成人精品av在线| 亚洲综合精品伊人久久| 亚洲精品美女视频| 欧美午夜精品在线| 911国产网站尤物在线观看| 色777狠狠综合秋免鲁丝| 精品久久久久久电影| 成人午夜两性视频| 色综合五月天导航| 国产精品成人av性教育| 成人免费视频xnxx.com| 美女性感视频久久久| 青草青草久热精品视频在线网站| 国产精品高清网站| 黄色一区二区在线观看| 免费97视频在线精品国自产拍| 日韩中文字幕久久| 欧美激情一级欧美精品| 国外成人免费在线播放| 国产精欧美一区二区三区| 亚洲视频视频在线| 亚洲小视频在线观看| 亚洲最大在线视频| 欧美在线视频免费播放| 日韩av在线一区二区| 成人伊人精品色xxxx视频| 久久中文字幕在线| 欧美国产高跟鞋裸体秀xxxhd| 欧美日韩国产精品一区二区三区四区| 欧美中文字幕视频在线观看| 国产乱人伦真实精品视频| 国产精品99久久久久久久久久久久| 中文字幕日韩欧美在线视频| 青青a在线精品免费观看| 欧美日韩国产第一页| 国产精品嫩草影院久久久| 日韩综合视频在线观看| 精品亚洲国产视频| 欧美高清在线播放| 国产精品三级美女白浆呻吟| 国产成人高潮免费观看精品| 国产精品福利在线观看网址| 亚洲成人av在线| 视频一区视频二区国产精品| 97在线视频免费播放| 在线看福利67194| 国产欧美日韩中文字幕| 国产亚洲精品一区二555| 亚洲精品国产欧美| 国产成人精品免费久久久久| 韩国福利视频一区| 91免费精品国偷自产在线| 亚洲色图综合久久| 午夜精品蜜臀一区二区三区免费| 久久91超碰青草是什么| 亚洲精品久久久久| 欧美日韩国产中文精品字幕自在自线| 欧美成年人在线观看| 国产精品成人免费电影| 一区二区三区回区在观看免费视频| 成人午夜激情免费视频| 精品国产999| 美日韩在线视频| 日韩高清电影免费观看完整版| 精品国产精品三级精品av网址| 欧美综合激情网| 国产精品久久久久久久久久久久久| 亚洲欧美成人一区二区在线电影| 狠狠躁夜夜躁人人爽天天天天97| 欧美在线性视频| 欧美乱妇高清无乱码| 欧美激情性做爰免费视频| 亚洲自拍欧美色图| 色妞色视频一区二区三区四区| 97在线视频免费观看| 丁香五六月婷婷久久激情| 欧美电影第一页| 91免费看片在线| 亚洲国产精彩中文乱码av| 96sao精品视频在线观看| 欧美成人精品一区二区| 久久综合国产精品台湾中文娱乐网| 国产精品扒开腿做爽爽爽的视频| 中文字幕av一区二区三区谷原希美| 国产精品欧美亚洲777777| 国产精品尤物福利片在线观看| 亚洲a成v人在线观看| 日韩电视剧免费观看网站| 国产最新精品视频| 国产精品久久久久久久久久免费| 亚洲欧洲av一区二区| 在线视频精品一| 中文字幕欧美专区| 久久精品成人动漫| 欧美丝袜第一区| 亚洲福利在线播放| 国产一区二区激情| 亚洲第一页自拍| 日韩精品欧美国产精品忘忧草| 尤物九九久久国产精品的分类| 91在线中文字幕| 国产丝袜一区视频在线观看| 久久6精品影院| 国模gogo一区二区大胆私拍| 大伊人狠狠躁夜夜躁av一区| 久久婷婷国产麻豆91天堂| 亚洲精品99999| 久久精品中文字幕| 国产日韩在线视频| 亚洲无线码在线一区观看| 亚洲伊人久久综合| 欧美激情精品久久久久| 国产v综合v亚洲欧美久久| 亚洲国产日韩欧美在线图片| 国产精品视频99| 日韩久久免费视频| 日韩hd视频在线观看| 91精品在线国产|