Groovy使用~”pattern” 来支持正则表达式,它将使用给定的模式字符串创建一个编译好的Java Pattern 对象。Groovy也支持 =~(创建一个Matcher)和 ==~ (返回boolean,是否给定的字符串匹配这个pattern)操作符。
对于groups的匹配, matcher[index] 是一个匹配到的group字符串的List或者string。
1 |
import java.util.regex.Matcher
|
2 |
import java.util.regex.Pattern
|
5 |
assert pattern instanceof Pattern
|
6 |
assert pattern.matcher("foo").matches()
|
7 |
assert pattern.matcher("foobar").matches()
|
10 |
assert "cheesecheese" =~ "cheese"
|
11 |
assert "cheesecheese" =~ /cheese/
|
12 |
assert "cheese" == /cheese/
|
13 |
assert ! ("cheese" =~ /ham/)
|
16 |
assert "2009" ==~ /\d+/
|
17 |
assert "holla" ==~ /\d+/
|
20 |
def matcher = "cheesecheese" =~ /cheese/
|
21 |
assert matcher instanceof Matcher
|
24 |
def cheese = ("cheesecheese" =~ /cheese/).replaceFirst("nice")
|
25 |
assert cheese == "nicecheese"
|
26 |
assert "color" == "colour".replaceFirst(/ou/, "o")
|
28 |
cheese = ("cheesecheese" =~ /cheese/).replaceAll("nice")
|
29 |
assert cheese == "nicenice"
|
39 |
def m = "foobarfoo" =~ /o(b.*r)f/
|
40 |
assert m[0] == ["obarf", "bar"]
|
41 |
assert m[0][1] == "bar"
|
46 |
matcher = "eat green cheese" =~ "e+"
|
48 |
assert "ee" == matcher[2]
|
49 |
assert ["ee", "e"] == matcher[2..3]
|
50 |
assert ["e", "ee"] == matcher[0, 2]
|
51 |
assert ["e", "ee", "ee"] == matcher[0, 1..2]
|
53 |
matcher = "cheese please" =~ /([^e]+)e+/
|
54 |
assert ["se", "s"] == matcher[1]
|
55 |
assert [["se", "s"], [" ple", " pl"]] == matcher[1, 2]
|
56 |
assert [["se", "s"], [" ple", " pl"]] == matcher[1 .. 2]
|
57 |
assert [["chee", "ch"], [" ple", " pl"], ["ase", "as"]] == matcher[0,2..3]
|
60 |
matcher = "cheese please" =~ /([^e]+)e+/
|
61 |
matcher.each { println it }
|
63 |
assert matcher.collect { it }?? ==
|
64 |
[["chee", "ch"], ["se", "s"], [" ple", " pl"], ["ase", "as"]]
|
70 |
assert ["foo", "moo"] == ["foo", "bar", "moo"].grep(~/.*oo$/)
|
72 |
assert ["foo", "moo"] == ["foo", "bar", "moo"].findAll { it ==~ /.*oo/ }
|
More Examples
匹配每行开头的大写单词:
15 |
assert expected == before.replaceAll(/(?m)^\w+/,
|
16 |
{ it[0].toUpperCase() + ((it.size() > 1) ? it[1..-1] : '') })
|
匹配字符串中的每一个大写单词
1 |
assert "It Is A Beautiful Day!" ==
|
2 |
("it is a beautiful day!".replaceAll(/\w+/,
|
3 |
{ it[0].toUpperCase() + ((it.size() > 1) ? it[1..-1] : '') }))
|
使用 .toLowerCase() 让其他单词小写:
1 |
assert "It Is A Very Beautiful Day!" ==
|
2 |
("it is a VERY beautiful day!".replaceAll(/\w+/,
|
3 |
{ it[0].toUpperCase() + ((it.size() > 1) ? it[1..-1].toLowerCase() :'') }))
|
Gotchas
怎么使用String.replaceAll()的反向引用
GStrings 可能和你期望的不一样
1 |
def replaced = "abc".replaceAll(/(a)(b)(c)/, "$1$3")
|
产生一个类似于下面的错误:
[] illegal string body character after dollar sign:
解决办法:: either escape a literal dollar sign “\$5″ or bracket the value expression “${5}” @ line []
Solution:
Use ‘ or / to delimit the replacement string:
1 |
def replaced = "abc".replaceAll(/(a)(b)(c)/, '$1$3')
|