9. Groovy 运算符-正则表达式的运算符学习

2022-12-07 18:26:19 浏览数 (3)

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。具体示例如下:

代码语言:javascript复制
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,而是返回布尔值,并且需要输入字符串的严格匹配,示例如下:

代码语言:javascript复制
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 地址,写法为:

代码语言:javascript复制
def text = 'zinyan.com'  //一个字符串
def pattern = ~/S .com/  // 创建一个Pattern模式对象
println(text ==~ pattern) //进行匹配比较,输出ture

匹配字符串为任意字符加.com结尾的字符串就代表成功。所以上面示例输出结果为:true。

上面有介绍,~创建Pattern对象,那么如果~==~或者=~ 一起使用怎么办?可以省略一个~符号,例如上面的示例:

代码语言:javascript复制
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. 小结

  1. 我们可以通过~/.../快捷键创建一个Pattern对象,当然也可以通过new Patter() 创建该对象了。这个对象存储的就是正则表达式的匹配规则。
  2. Groovy提供了两种正则匹配操作符,一种是查找模式使用 =~。会将所有满足匹配的结果存储在Match类中。我们可以获取匹配的数量和内容。
  3. 第二种正则匹配操作符使用==~符号,可以直接比较字符串是否符合标准,不会反悔到底有多少的内容符合标注。而只会返回true和false两种情况。

理解清楚后,多写一些匹配规则和运行Demo。我们就能够弄明白这两者之间的区别和关系了。

最后,附上官方文档链接地址:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#_regular_expression_operators 。不得不说,官方的示例猛的一看,还有些难理解。但是按照代码跑一遍,就能够区分了。其次assert断言的使用,可能在程序中用的挺好。

可是在示例代码中,大量使用断言会让新手摸不着头脑的、比对输出值,进行代码理解可能更直观一些吧。

下一篇,学习Groovy运算符的剩下的全部运算符,简称其他运算符。

1 人点赞