正則表達式是一種基礎的模式匹配技術,是一個強大的字符串處理工具。使用合適的正則表達式,可以對文本執行過濾、剝離(strip)、替換、搜索等操作。
正則表達式
正則表達式的工作原理
正則表達式由複雜的狀態機解析,嘗試在目標文本中找到最佳匹配。文本可以是管道的輸出、文件,甚至是在命令行中輸入的字符串。正則表達式的實現方法不止一種,其實現引擎通常會選擇最長的匹配。
位置標記
位置標記錨點是標識字符串位置的正則表達式,默認情況下,正則表達式所匹配的字符可以出現在字符串中任何位置。
正則表達式 | 描述 | 示例 |
---|---|---|
^ | 指定了匹配正則表達式的文本必須起始於字符串的首部 | ^tux能夠匹配以tux起始的行 |
$ | 指定了匹配正則表達式的文本必須結束於目標字符串的尾部 | tux$能夠匹配以tux結尾的行 |
標識符
標識符是正則表達式的基礎組成部分。它定義了那些爲了匹配正則表達式,必須存在(或不存在)的字符。
正則表達式 | 描述 | 示例 |
---|---|---|
A字符 | 正則表達式必須匹配該字符 | A能夠匹配字符A |
. | 匹配任意一個字符 | .只能匹配單個字符 |
[ ] | 匹配中括號內的任意一個字符,中括號內可以是一個字符組或字符範圍 | coo[kl]能夠匹配cook或cool,[0-9]匹配任意單個數字 |
[^] | 匹配不在括號中的任意一個字符,中括號內可以是一個字符組或字符範圍 | 9[ ^01]能夠匹配92和93,但是不能匹配91和90;A[ ^0-9]匹配A以及隨後除數字外的任意單個字符 |
數量修飾符
一個標識符可以出現一次、多次或是不出現。數量修飾符定義了模式可以出現的次數
正則表達式 | 描述 | 示例 |
---|---|---|
? | 匹配之前的項1次或0次 | colou?r能夠匹配color或colour,但不能匹配colouur |
+ | 匹配之前的項1次或多次 | Rollno-9+能夠匹配Rollno-99或Rollno-9,但不能匹配Rollno- |
* | 匹配之前的項0次或多次 | co*l能夠匹配col、cl、cool、coool |
{n} | 匹配在之前的項n次 | [0-9]{3}能夠匹配任意的三位數,[0-9]{3}可以擴展爲[0-9][0-9][0-9] |
{n,} | 之前的項至少匹配n次 | [0-9]{2,}能夠匹配任意一個兩位或更多位的數字 |
{n,m} | 之前的項所必須匹配的最小次數和最大次數 | [0-9]{2,5}能夠匹配兩位數到五位數中的任意一個數字 |
其他
還有一些其他的特殊字符可以調整正則表達式的匹配方式
正則表達式 | 描述 | 示例 |
---|---|---|
( ) | 將括號中的內容視爲一個整體 | ma(tri)?x能夠匹配max或matrix |
| | 指定了一種選擇結構,可以匹配|兩邊的任意一項 | oct (1st|2nd)能夠匹配oct 1st 或 oct 2nd |
\ | 轉義字符可以轉義之前介紹的特殊字符 | a\.b能夠匹配a.b,但不能匹配ajb,因爲ie\忽略了.的特殊意義 |
實例
一、能夠匹配任意單詞的正則表達式
( +[a-zA-Z]+ +)
開頭的+表示需要匹配一個或多個空格,[a-zA-Z]表示匹配所有的大小寫字母,隨後的+表示至少要匹配一個字母,多者不限,最後的+表示需要匹配一個或多個空格來終結單詞。
這個正則表達式無法匹配句子末尾的單詞。要想匹配句尾或是逗號之前的單詞,需要將正則表達式改寫爲:
( +[a-zA-Z]+[?,.]? +)
[?,.]?表示僅需要匹配問好、逗號、句號中的一個
二、匹配郵箱地址
[a-Z0-9_]+@[a-z0-9]+.[a-z]+.