資源:git
- 連接:https://pan.baidu.com/s/1ET9K_AXMK-Nfy_zIlDjt7g
- 提取碼:n072
注:本文所用正則表達式查找替換工具爲notepad++web
第一章 正則表達式入門
正則表達式(regular expression),一種工具。正則表達式
用途:查找特定的信息(搜索);查找並編輯特定的信息(替換)。express
正則表達式是一些用來匹配和處理文本的字符串,是由正則語言建立的。apache
正則表達式語言並非一種完備的程序設計語言,甚至算不上一種可以直接安裝並運行的程序。正則表達式是一種內置於其餘語言或軟件產品中的「迷你」語言。app
第二章 匹配單個字符
1.純文本正則表達式
【文本】less
Hello, my name is Ben. Please visitide
my website at http://www.forta.com/工具
正則表達式是大小寫敏感的this
經過某些條件能夠指定不區分字母大小寫的匹配操做
2.匹配任意字符
.字符能夠匹配任意一個單個的字符
【文本】
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
\爲轉義字符,做用是告訴正則表達式咱們須要的是.字符自己,而不是其在正則語言中的特殊含義
第三章 匹配一組字符
1.字符集合
【文本】
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
使用元字符[和]能夠定義一個字符集合
[大寫字母+小寫字母]用於局部不區分大小寫的匹配
【文本】
The phrase \'regular expression\' is often
abbreviated as RegEx or regex
2.字符集合區間
【文本】
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
數字集合用於過濾sam.xls
正則表達式提供了一個特殊的元字符——字符區間能夠用-(連字符)來定義
如[A-Z],[a-z],[0-9],[A-Za-z0-9]
字符區間的首、尾字符能夠是ASCII字符表中的任意字符,但在實際中經常使用的只有上面的示例
【文本】
<BODY BGCOLOR=\'#336633\' TEXT=\'#FFFFFF\'
MARGINWIDTH=\'0\' MARGINHEIFHT=\'0\'
TOPMARGI\'0\' LEFTMARGIN=\'0\'>
匹配一個RGB色彩值
3.取非匹配
【文本】
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
^能夠進行取非操做,這與邏輯非很類似
第四章 使用元字符
1.對特殊字符進行轉義
【文本】
var myArray = new Array();
...
if (myArray[0] == 0){
...
}
任何一個元字符均可以經過給它加上一個反斜槓字符(\)做爲前綴的辦法來轉義
【文本】
\home\ben\sales
\字符也是一個元字符,在須要匹配\自己的時候,咱們必須把它轉義爲\\
2.匹配空白字符
[\b] | 回退(並刪除)一個字符 |
\f | 換頁符 |
\n | 換行符 |
\r | 回車符 |
\t | 製表符 |
\v | 垂直製表符 |
【文本】
"101","Ben","Forta"
"102","Jim","James"
"103","Roberta","Robertson"
"104","Bob","Bobson"
\r\n匹配一個「回車+換行」組合,\r\n\r\n能夠匹配空白行
3.匹配特定的字符類別
\d | 任何一個數字字符[0-9] |
\D | 任何一個非數字字符[^0-9] |
\w | 任何一個字母數字字符或下劃線字符[a-zA-Z0-9_] |
\W | [^a-zA-Z0-9_] |
【文本】
11213
A1C2E3
48075
48237
M1B4F2
90046
H1H2H2
匹配加拿大城市的郵政編碼
\s | 任何一個空白字符[\f\n\r\t\v] |
\S | [^\f\n\r\t\v] |
4.使用十六進制值和八進制值
十六進制值要用前綴\x來給出——\x0A對應於ASCII字符10,效果等價於\n
八進制值要用前綴\0來給出——\011對應於ASCII字符9,效果等價於\t
5.POSIX字符類
[:digit:] | 任何一個數字[0-9] |
[:alpha:] | 任何一個字母[a-zA-Z] |
[:upper:] | 任何一個大寫字母[A-Z] |
[:lower:] | 任何一個小寫字母[a-z] |
[:alnum:] | 任何一個字母或數字[a-zA-Z0-9] |
[:space:] | 任何一個空白字符(含空格)[\f\n\r\t\v ] |
[:blank:] | 空格或製表符[\t ] |
[:cntrl:] | ASCII控制字符(ASCII0到31,再加上ASCII127) |
[:print:] | 任何一個可打印字符 |
[:graph:] | 不包括空格的可打印字符 |
[:punct:] | 既不屬於[:alnum:]也不屬於[:cntrl:]的任何一個字符 |
[:xdigit:] | 任何一個十六進制數字[a-fA-F0-9] |
【文本】
<BODY BGCOLOR=\'#336633\' TEXT=\'#FFFFFF\'
MARGINWIDTH=\'0\' MARGINHEIFHT=\'0\'
TOPMARGI\'0\' LEFTMARGIN=\'0\'>
匹配一個RGB色彩值
外層的[和]用來定義一個字符集合,內層的[和]字符是POSIX字符類自己的組成部分
第五章 重複匹配
1.一次或屢次重複
要想匹配同一個字符的屢次重複,只要給這個字符後加上一個+字符做爲後綴就好了。
使用+能夠匹配一個或多個字符(+是一個元字符,匹配+自己須要轉義)
【文本】
Send personal email to ben@forta.com. For questions
about a book use support@forta.com. Feel free to send
unsolicited email to spam@forta.com (wouldn't it be
nice if it were that simple, huh?).
【文本】
Send personal email to ben@forta.com or
ben.forta@forta.com. For questions about a
book use support@forta.com. If your message
is urgent try ben@urgent.forta.com. Feel
free to send unsolicited email to
spam@forta.com (wouldn't it be
nice if it were that simple, huh?).
當在字符集合裏使用的時候,像.和+這樣的元字符將被解釋爲普通字符,能夠沒必要轉義。
2.零次或屢次重複
*的用法與+徹底同樣
【文本】
Hello .ben@forta.com is my email address.
使用*,排除原文中多加了一個.的錯誤。
3.零次或一次出現
?只能匹配一個字符的零次或一次出現
【文本】
The URL is http://www.forta.com/, to connect
securely use https://www.forta.com/ instead.
4.設定匹配的重複次數
重複次數要用{和}來給出——把數值寫在它們之間({和}是元字符)
還可使用,來分割最小次數和最大次數
{6} | 重複6次 |
{2,4} | 最少重複2次,最多重複4次 |
{3,} | 至少重複3次 |
【文本】
4/8/03
10-6-2004
2/2/2
01-01-01
【文本】
1001: $496.80
1002: $1290.69
1003: $26.43
1004: $613.42
1005: $7.61
1006: $414.90
1007: $25.00
查找大於100美圓的記錄
5.防止過分匹配
【文本】
This offer is not available to customers
living in <B>AK</B> and <B>HI</B>.
由於*和+都是所謂的「貪婪型」元字符,它們在進行匹配時的行爲模式是多多益善而不是適可而止的。
貪婪型元字符 | 懶惰型元字符 |
* | *? |
+ | +? |
{n,} | {n,}? |
第六章 位置匹配
1.單詞邊界
【文本】
The cat scattered his food all over the room.
限定符\b能夠指定單詞邊界,用來匹配一個單詞的開始或結尾。(b——boundary)
實際上,\b匹配的是這樣一個位置,這個位置位於一個可以用來構成單詞的字符(字母、數字和下劃線,即與\w匹配的字符)和一個不能用來構成單詞的字符(\W)之間。
【文本】
The captain wore his cap and cape proudly as
he sat listening to the recap of how his
crew saved the men from a capsized vessel.
搜索以cap開頭或結尾的單詞。
\B能夠匹配非單詞邊界
即字母數字下劃線之間,或者非字母數字下劃線之間
2.字符串邊界
^ | 用來定義字符串開頭 |
$ | 用來定義字符串結尾 |
【文本】
<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions targetNamespace="http://tips.cf"
xmlns:impl="http://tips.cf" xmlns:intf="http://tips.cf"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
3.分行匹配模式
分行匹配模式((?m))將使得正則表達式引擎把行分隔符當作一個字符串分隔符來對待。
在這種模式下,^不只能匹配正常的字符串開頭,還將匹配換行符後面的開始位置。
$不只能匹配正常的字符串結尾,還將匹配換行符後面的結束位置。
注意,(?m)必須出如今整個模式的最前面。
【文本】
<SCRIPT>
function doSpellCheck(form, field){
//Make sure not empty
if(field.value == ''){
return false;
}
//Init
var windowName='spellWindow';
var
spellCheckURL='spell.cfm?formname=comment&fieldname='+field.name;
...
//Done
return false;
}
</SCRIPT>
找出程序中的每一條註釋
第七章 使用子表達式
1.子表達式
子表達式是一個更大的表達式的一部分,把一個表達式劃分爲一系列子表達式的目的是爲了把那些子表達式當作一個獨立元素來使用。子表達式必須用(和)括起來。
【文本】
Hello, my name is Ben Forta, and I am
the author of books on SQL, ColdFusion, WAP,
Windows 2000, and other subjects.
匹配連續出現兩次及以上的非換行空格
【文本】
Pinging hog.forta.com [12.159.46.200]
with 32 bytes of data;
匹配IP地址
【文本】
ID: 042
SEX: M
DOB: 1967-08-17
Status: Active
匹配年份。
|爲或運算符
2.子表達式的嵌套
子表達式容許多重嵌套,但在實際工做中應當適可而止。
把必須匹配的狀況考慮周全,並寫出一個匹配結果符合預期的正則表達式很容易,但把不須要匹配的狀況也考慮周全,並確保它們都將被排除在匹配結果之外,每每要困難的多!
IP地址的準確匹配:(0~255)
- 任何一個1位或2位數字
- 任何一個以1開頭的3位數字
- 任何一個以2開頭、第2位數字在0~4之間的3位數字
- 任何一個以25開頭、第三位數字在0~5之間的3位數字
原書:(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
改進:(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))
【文本】
Pinging hog.forta.com [12.159.46.200]
with 32 bytes of data;
第八章 回溯引用:先後一致匹配
1. 回溯引用
回溯引用容許正則表達式模式引用前面的匹配結果。
【文本】
This is a block of of text,
several words here are are
repeated, and and they
should not be.
找出文本中重複了兩遍的單詞。(打字錯誤)
\1是一個回溯引用,它引用的正是前面()中劃分出來的那個子表達式。
【文本】
<BODY>
<H1>Welcome to my Homepage</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
</BODY>
匹配各級標題。
2. 回溯引用用來替換
【文本】
Hello .ben@forta.com is my email address.
將原始文本中的電子郵件地址轉換爲可點擊的連接。
【結果】
Hello .<A HREF="mailto:ben@forta.com">ben@forta.com</A> is my email address.
【文本】
313-555-1234
248-555-9999
810-555-9000
將電話號碼從新排版爲所需的格式。
【結果】
(313) 555-1234
(248) 555-9999
(810) 555-9000
3.大小寫轉換
\l | 把下一個字符轉換爲小寫 |
\u | 把下一個字符轉換爲大寫 |
\L | 把\L和\E之間的字符所有轉換爲小寫 |
\U | 把\U和\E之間的字符所有轉換爲大寫 |
\E | 結束\L或\U轉換 |
【文本】
<BODY>
<H1>Welcome to my Homepage</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
</BODY>
把一級標題的文字轉換爲大寫。
【結果】
<BODY>
<H1>WELCOME TO MY HOMEPAGE</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
</BODY>
第九章 先後查找
1. 先後查找
有時咱們使用正則表達式除了匹配文本,還須要標記匹配的文本的位置(而不只僅是文本自己)。這就須要用先後查找對某一位置的前、後內容進行查找)。
向前查找指定了一個必須匹配但不在結果中返回的模式。向前查找是一個以?=開頭的子表達式,須要匹配的文本跟在=的後面。
【文本】
http://www.forta.com/
https://mail.forta.com/
向後查找操做符是?<=
【文本】
ABC01: $23.45
HGG42: $5.31
CFMX1: $899.00
XTC99: $69.96
Total items found: 4
向前查找模式的長度是可變的,它們能夠包含.和+之類的元字符,因此很是靈活。
而向後查找模式只能是固定長度,幾乎全部的正則表達式都遵照這一限制。
【文本】
<HEAD>
<TITLE>Ben Forta's Homepage</TITLE>
</HEAD>
查找標題內容——結合使用向前和向後模式。
2.對先後查找取非
負向前查找:向前查找不與給定模式相匹配的文本
負向後查找:向後查找不與給定模式相匹配的文本
(?=) | 正向前查找 |
(?!) | 負向前查找 |
(?<=) | 正向後查找 |
(?<!) | 負向後查找 |
【文本】
I paid $30 for 100 apples,
50 oranges, and 60 pears.
I saved $5 on this order.
只匹配數量,而不匹配價格。
第十章 嵌入條件
1. 嵌入條件
正則表達式還有一個威力強大的功能——在表達式的內部嵌入條件處理功能。
正則表達式裏的條件要用?來定義。
嵌入條件使用的兩種狀況:
根據一個回溯引用來進行條件處理
根據一個先後查找來進行條件處理
【文本】
<!-- Nav bar -->
<TD>
<A HREF="/home"><IMG SRC="/images/home.gif"></A>
<IMG SRC="/images/spacer.gif">
<A HREF="/search"><IMG SRC="/images/search.gif"></A>
<IMG SRC="/images/spacer.gif">
<A HREF="/help"><IMG SRC="/images/help.gif"></A>
</TD>
把文本中的<IMG>標籤所有找出來,若是某個<IMG>標籤是一個連接的話,匹配整個連接標籤。
(<[Aa]\s+[^>]+>\s*)?<[Ii][Mm][Gg]\s+[^>]+>(?(1)\s*</[Aa]>)
【文本】(第1條和第2條是正確的格式)
123-456-7890
(123)456-7890
(123)-456-7890
(123-456-7890
1234567890
123 456 7890
查找格式符合要求的電話號碼。
2.先後查找條件
先後查找條件只在一個向前查找或向後查找取得成功的狀況下才容許一個表達式被調用。
【文本】(第3個格式不正確)
11111
22222
33333-
44444-4444
總結
1.非打印字符
\cx | 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Z或a-z之一。不然,將c視爲一個原義的'c'字符 |
\f | 匹配一個換頁符。等價於\x0c和\cL |
\n | 匹配一個換行符。等價於\x0a和\cJ |
\r | 匹配一個回車符。等價於\x0d和\cM |
\s | 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於[\f\n\r\t\v]。注意Unicode正則表達式會匹配全角空格符 |
\S | 匹配任何非空白字符。等價於[^\f\n\r\t\v] |
\t | 匹配一個製表符。等價於\x09和\cI |
\v | 匹配一個垂直製表符。等價於\x0b和\cK |
2.特殊字符
$ | 匹配輸入字符串的結尾位置。若是設置了RegExp對象的Multiline屬性,則$也匹配'\n'或'\r'。要匹配$字符自己,請使用\$ |
( ) | 標記一個子表達式的開始和結束位置。子表達式能夠獲取供之後使用。要匹配這些字符,請使用\(和\) |
* | 匹配前面的子表達式零次或屢次。要匹配*字符,請使用\* |
+ | 匹配前面的子表達式一次或屢次。要匹配+字符,請使用\+ |
. | 匹配除換行符\n以外的任何單字符。要匹配.,請使用\. |
[ | 標記一箇中括號表達式的開始。要匹配[,請使用\[ |
? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配?字符,請使用\? |
\ | 將下一個字符標記爲或特殊字符、或原義字符、或向後引用、或八進制轉義符。例如,'n'匹配字符'n'。'\n'匹配換行符。序列'\\'匹配"\",而'\('則匹配"(" |
^ | 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配^字符自己,請使用\^ |
{ | 標記限定符表達式的開始。要匹配{,請使用\{ |
| | 指明兩項之間的一個選擇。要匹配|,請使用\| |
3.限定符
{n} | n 是一個非負整數。匹配肯定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',可是能匹配 "food" 中的兩個 o |
{n,} | n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的全部 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*' |
{n,m} | m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格 |