Java 需處理 Pattern/Matcher、雙重轉義、樣板代碼。Groovy 封裝並提供:
/.../:免雙重轉義。~:字符串 → Pattern。=~:字符串 + 模式 → Matcher。==~:整串匹配 → boolean。assert (/Hello World/ in String)
assert (/Hi \there/ == 'Hi \\there') // 單反斜線即可
def p = ~/\b[a-zA-Z]\b/ // 等同 Pattern.compile("\\b[a-zA-Z]\\b")
| 模式 | 含義 |
|---|---|
a? | 0 或 1 個 a |
a* | 0 或多個 a |
a+ | 1 或多個 a |
a|b | a 或 b |
(ab) | 分組 |
. | 任意字符 |
[abc] | a、b 或 c |
[^abc] | 非 a/b/c |
[a-z] | 小寫字母 |
\d | 數字 [0-9] |
\s | 空白字符 |
\w | 字母/數字/下劃線 |
\b | 單詞邊界 |
^ | 行首 |
$ | 行尾 |
=~ → Matcherdef matcher = "Groovy" =~ /G.*/
assert matcher instanceof Matcher
assert matcher.matches()
Matcher 視為二維矩陣:matcher[0] 為第一個匹配整串,matcher[0][1] 為第一組捕獲組。
def text = """Lorem 1:30 PM ipsum dolor 12:00 PM sit amet"""
def HOUR = /10|11|12|[0-9]/
def MINUTE = /[0-5][0-9]/
def AM_PM = /AM|PM/
def time = /($HOUR):($MINUTE) ($AM_PM)/
def matcher = text =~ time
assert matcher[0] == ["1:30 PM", "1", "30", "PM"]
assert matcher[1] == ["12:00 PM", "12", "00", "PM"]
==~ → booleanassert "Groovy" ==~ /G.*/
assert 123 ==~ /\d+/
assert !(123 ==~ /\D+/)
// 首次替換
assert "Welcome To Groovy" == "Welcome 2 Groovy".replaceFirst(/\d/, "To")
// 閉包處理每個捕獲組
assert "Hello GROOVY, GROOVY rocks" ==
"Hello Groovy, Groovy rocks".replaceAll("Groovy") { it[0].toUpperCase() }
grepassert ["Groovy"] == ["Groovy", "Rocks"].grep(~/G.*/)
/.../ 斜線字符串,減少轉義認知負荷。HOUR、MINUTE),提升可讀性。==~,查找提取用 =~,編譯複用用 ~。replaceAll 表達力最強。