學習正則表達式心得

句點(.)

一個.表示匹配任何單個字符。這個正則表達式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分鐘學會正則表達式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章