1. 介绍
本篇为Groovy学习笔记第9篇,今天学习Groovy中运算符知识中的正则表达式和一些没有进行统一归纳的运算符。
在前面已经有学习算术运算符,关系运算符,条件运算符,位运算符,对象运算符,逻辑运算符。
今天学习Groovy运算符中对于正则表达式的缩写运算符。不会介绍正则表达式的写法,而是介绍如何在Groovy中使用正则表达式哦。
相关正则表达式的匹配规则是跨平台,跨语言的。所有支持正则表达式的语言,他们使用的正则表达式都是一样的。
2. 正则表达式运算符-Regular expression operators
2.1 模式操作符,快速创建Pattern
在正则表达式运算符中,可以通过~
模式操作符,快速创建一个java.util.regex.Pattern
对象。
示例如下:
代码语言:javascript复制def p = ~/zinyan/ //创建了一个模式对象
assert p instanceof Pattern //断言比较,该变量是否为Pattern对象。很明显它就是的。
PS:Pattern对象是java中的关于正则表达式的模板对象。
可以在斜线字符串中创建表达式的模式运算符,还可以与Groovy中的String一起使用:
代码语言:javascript复制def p = ~/zinyan/ //普通创建方式
println(p) //输出:zinyan
p = ~'zinyan' //单引号创建
println(p) //输出:zinyan
p = ~"zinyan" //双引号创建
println(p) //输出:zinyan
//利用$包裹创建。($符号创建的也是字符串,可以通过我第3篇Groovy学习笔记了解)
p = ~$/dollar/slashy $ String/$
println(p) //输出:dollar/slashy $ String
def zinyan = "z同学.com"
p = ~"${zinyan}" //也可以通过包裹变量进行创建
println(p) //输出:z同学.com
虽然大多数String都可以与Pattern、Find和Match运算符一起使用,但Groovy建议大多数时候使用斜线字符串,以避免记住其他需要的转义要求。
也就是第一种的创建模式。
2.2 查找运算符(Find operator)
除了构建模式,您还可以使用find操作符=~
直接创建java.util.regex.Matcher
。具体示例如下:
import java.util.regex.Matcher
def text = "这是需要匹配的文档,来自zinyan.com 网站"
def m = text =~ /zinyan/ //通过 运算符 =~ 将会创建一个Matcher对象
if (!m) { // if (!m.find(0)) 获取查找到的第一个字符
println("失败,没有找到文本") //输出了这个提示内容。
}else{
println("成功,找到需要的文本")
}
必须添加上import java.util.regex.Matcher
的引入。否则会报错找不到Matcher类。
其中的=~
运算之后,将会创建一个Matcher对象。
由于Matcher通过调用其find方法强制布尔值,所以当它出现在if/else
、?:
等表达式中时,=~
运算符与Perl的=~
运算符的简单使用是一致的。当目的是迭代指定模式的匹配(in
while
等)时,直接在匹配器上调用find()
或使用iterator
模式。
如果不能理解查找运算符的意义,建议可以通过搜索:java Matcher 弄明白Matcher类的作用。 下面目录2.4中有具体示例介绍使用场景。可以方便理解
2.3 匹配运算符(Match operator)
匹配操作符==~
是查找运算符的一个轻微变体,它不返回Matcher,而是返回布尔值,并且需要输入字符串的严格匹配,示例如下:
def text = "zinyan.com"
def m = text ==~ /zinyan.com/ //通过 运算符 ==~ 将会创建一个Boolean 值
if (m) {
println("成功,文本匹配") //结果输出这段文本。
}else{
println("失败,没有找到文本")
}
结合这两种匹配模式,我们能够理解两者的差异。弄明白正则表达式中的查找模式(find)和匹配模式(Match)。
我们也可以通过代码和方法名称创建,也可以通过操作符==~
和=~
进行快速创建。
下面通过正则表达式的各种关键字,进行实际使用看看两个运算符的使用吧。
2.4 查找运算和匹配运算的比较
通常,当模式涉及单个精确匹配时使用Match运算符,否则find运算符可能更有用。而我们实际在开发中,更多的通过通配符实现的是Match匹配运算实现的正则表达式比较。
通过示例代码来了解一下:
代码语言:javascript复制//通过Match 匹配运算符比较字符串是否满足正则表达式
def text = 'two words' //一个字符串
def match = ~/S s S / // 创建一个Pattern模式对象
println(text ==~ match) //进行匹配比较,输出ture
在上面的示例中,~/中间内容为正则表达式/
例如上面的
S
表示任何非空字符串, s
表示任何空字符串, 号只是将正则表达式的字符进行拼接而已。
例如我要匹配.com
地址,写法为:
def text = 'zinyan.com' //一个字符串
def pattern = ~/S .com/ // 创建一个Pattern模式对象
println(text ==~ pattern) //进行匹配比较,输出ture
匹配字符串为任意字符加.com结尾
的字符串就代表成功。所以上面示例输出结果为:true。
上面有介绍,~
创建Pattern对象,那么如果~
和==~
或者=~
一起使用怎么办?可以省略一个~
符号,例如上面的示例:
def text = 'zinyan.com' //一个字符串
println(text ==~ ~/S .com/) //进行匹配比较,输出ture 这个可以进行省略。
println(text ==~ /S .com/) //进行匹配比较,输出ture 。和上面的是等效的。
PS:如果对正则表达式关键字和符号分不清,可以看https://zinyan.com/?p=210 文章中关于正则表达式的符号介绍。
匹配运算符比较好明白,下面介绍查找运算符的使用:
代码语言:javascript复制import java.util.regex.Matcher
//通过Find查找运算符比较字符串是否满足正则表达式
def text = 'zinyan.com' //一个字符串
def match = text =~ /S .com/ //输出的就不是一个boolean对象了,而是Match对象
println(match.size()) //输出:1
因为比对到了一个字符串符合的情况。所以Match输出1.我们如果添加多点 字母.com 形式就能匹配更多的:
代码语言:javascript复制import java.util.regex.Matcher
//通过Find查找运算符比较字符串是否满足正则表达式
def text = 'zinyan.com , http://zinyan.com' //一个字符串
def match = text =~ /S .com / //输出的就不是一个boolean对象了,而是Match对象
println(match.size()) //可以打印该对象的 长度 2
那么我们如果想知道匹配了哪几个结果值?很简单从match中获取就可以了:
代码语言:javascript复制import java.util.regex.Matcher
//通过Find查找运算符比较字符串是否满足正则表达式
def text = 'zinyan.com , https://zinyan.com' //一个字符串
def match = text =~ /S .com / //输出的就不是一个boolean对象了,而是Match对象
println(match.size()) //可以打印该对象的 长度
println(match[0]) //输出 zinyan.com
println(match[1]) //输出https://zinyan.com
3. 小结
- 我们可以通过
~/.../
快捷键创建一个Pattern对象,当然也可以通过new Patter() 创建该对象了。这个对象存储的就是正则表达式的匹配规则。 - Groovy提供了两种正则匹配操作符,一种是查找模式使用
=~
。会将所有满足匹配的结果存储在Match类中。我们可以获取匹配的数量和内容。 - 第二种正则匹配操作符使用
==~
符号,可以直接比较字符串是否符合标准,不会反悔到底有多少的内容符合标注。而只会返回true和false两种情况。
理解清楚后,多写一些匹配规则和运行Demo。我们就能够弄明白这两者之间的区别和关系了。
最后,附上官方文档链接地址:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#_regular_expression_operators 。不得不说,官方的示例猛的一看,还有些难理解。但是按照代码跑一遍,就能够区分了。其次assert断言的使用,可能在程序中用的挺好。
可是在示例代码中,大量使用断言会让新手摸不着头脑的、比对输出值,进行代码理解可能更直观一些吧。
下一篇,学习Groovy运算符的剩下的全部运算符,简称其他运算符。