句點(.)
一個.表示匹配任何單個字符。這個正則表達式c.t代表“先找到c,接着找到任何單個字符,再找到t”。
任何元字符如果用一個反斜杆\進行轉義就會變成字面值。所以上述的正則表達式c.t就代表“先找到c,接着找到句號,再找到t”。
反斜槓是一個元字符,這意味着它也可以使用反斜槓轉義。所以正則表達式c\t代表“先找到c,接着找到反斜杆,再找到t”。
注意! 在一些實現中,. 會匹配任意字符除了 換行符。這意味着“換行符”在不同的實現中也會變化。
字符類(Character classes)
字符類是字符在方括號中的集合。表示“找到其中任意的字符”。
- 正則表達式c[aeiou]t表示“找到c後跟一個元音字母,再找到t”。在一段文本中,將會匹配到cat,cet,cit,cot和cut。
- 正則表達式[0123456789]表示找到一個數字
- 正則表達式[a]和a意義相同:“找到a”
字符類區間(ranges)
你可以在字符類中使用連字符來表示一個字母或數字的區間:
- [b-f]和[bcdef]都表示“找到一個b或c或d或 e或f”。
- [A-Z]和[ABCDEFGHIJKLMNOPQRSTUVWXYZ]都表示“匹配大寫字母”。
- [1-9]和[123456789]都表示“匹配一個非零數字”。
連字符在字符類外部使用時並沒有特別都含義。正則表達式a-z表示“找到一個a接着跟着一個連字符,然後匹配一個z”。
注意。 區間是字符的區間,不是數字的區間。正則表達式[1-31]表示“找到一個1或一個 2或一個3”,不是“找到一個從1到31的整數”。
字符類的否定(negation)
你可以通過在最開始的位置使用插入符號(譯者注:^)來否定一個字符類。
- [^a]表示“匹配除了a的任意字符”。
- [^a-zA-Z0-9]表示“找到一個非字母數字字符”。
- [\^abc]表示“找到一個插入符或者a或者b或者c”。
字符類補充
\d含義與[0-9]一致:“匹配一個數字”。(爲了匹配一個反斜杆後跟一個d,可以使用\d。)
\w的含義與[0-9A-Za-z_]一致:“匹配一個單詞字符(譯者注:字母或數字或下劃線或漢字)”。
\s表示“匹配任意空白字符(空格,tab,回車或者換行)”。
\W同[^0-9A-Za-z_]:“匹配任意非單詞字符(譯者注:匹配任意不是字母,數字,下劃線,漢字的字符)”。
\D同[^0-9]:“匹配任意非數字的字符”。
\S表示“匹配任意不是空白符的字符”。
乘法器(Multipliers)
你可以在一個字面值或者字符類後跟着一個大括號來使用乘法器。
- a{1}同a,表示“匹配一個a”。
- a{3}表示“找到一個a後再跟一個a,最後找到一個a”。
- a{0}表示“匹配空字符”。就其本身而言,這似乎沒有用處。如果你在任何一段文本中使用該表達式,你會在你剛開始搜索的端點處立即得到一個匹配。即使你的文本爲空字符串結果也爲真。
- a{2}代表“找到一個a,跟着一個左大括號,接着跟匹配一個2,然後跟着一個右大括號”。
- 在字符類中大括號沒有特別的含義。[{}]代表“匹配一個左大括號或者一個右大括號”。
注意。 乘法器沒有記憶。該正則表達式[abc]{2}表示“匹配a或者b或者c,接着匹配a或者b或者c。這跟“匹配aa或ab或ac或ba或bb或bc或ca或cb或cc”相同。這跟“匹配aa或bb或cc”含義不同!
乘法器區間
值得注意的是優先選擇更長的匹配,因爲乘法器是貪婪的。如果你輸入的文本是I had an aaaaawful day,該正則表達式就會在aaaaawful中匹配到aaaaa。不會在第三個a後就停止匹配。
乘法器補充
?代表的含義與{0,1}相同。比如說,colour?r表示“匹配colour或color”。
等於{0,}。比如說,.表示“匹配一切”,跟上面提到的一樣。
+等於{1,}。比如說,\w+表示“匹配一個單詞”。這裏的“單詞”是1個或多個“單詞字符”的序列,就像_var或AccountName1。
惰性(Non-greed)
正則表達式”.“表示“找到一個雙引號,接着找到儘可能多的字符,最後再找到一個雙引號”。注意一下被.匹配的內部字符,很可能包含多個雙引號。這通常不是非常有用。
乘法器可通過追加問號來實現惰性。這裏對優先順序進行了反轉:
- \d{4,5}?表示“匹配\d\d\d\d或\d\d\d\d\d”。其實跟\d{4}行爲一致。
- colou??r就是colou{0,1}?r,表示“找到color或colour”。和colou?r行爲一致。
- “.*?”表示“匹配一個雙引號,跟着一個儘可能少的字符,再跟着一個雙引號”。這個不像上面兩個例子,實際上很有用。
分支(Alternation)
你可以使用管道符號來實現匹配多種選擇:
- 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或d或g或o或t或一個管道符號”。
組合(Grouping)
你可以使用圓括號來組合表達式:
- 在一週中找到一天,使用(Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day。
單詞邊界(Word boundaries)
正則表達式\b表示“匹配一個單詞邊界”。
單詞邊界不是字符。它們寬度爲零.下面的正則表達式表示相同的含義:
- (\bcat)\b
- (\bcat\b)
- \b(cat)\b
- \b(cat\b)
行邊界(Line boundaries)
- 正則表達式^表示“匹配開始行”。
- 正則表達式$表示“匹配結束行”。
- ^$表示“匹配空行”。
- ^.*
將會匹配整個文本,因爲換行符是一個字符,所以.會匹配它。爲了匹配單行,要使用惰性乘法器,.∗? 。 - \^$表示“匹配尖符號後跟着一個美元符號”。
- [$]表示“匹配一個美元符”。然而,[^]是非法單正則表達式。要記住的是尖符號在方括號中時有不同的特殊含義。把尖符號放在字符類中,這麼用[\^]。
像單詞邊界一樣,行邊界也不是字符。它們寬度爲零。下面的正則表達式表示相同的含義:
- (^cat)$
- (^cat$)
- ^(cat)$
- ^(cat$)
學習連接:55分鐘學會正則表達式