在Groovy中编写正则表达式

开发 开发工具
本文介绍了如何在Groovy中编写正则表达式。Groovy对正则表达式中需要处理的Pattern和Matcher对象做了简单封装,添加了一些额外的实用方法,并给出一个简化的新的语法和3个新的操作符。

与Java相比, 在Groovy中编写正则表达式(regexes)简直是一种乐趣。在Java中, regexes编程不仅需处理Pattern和Matcher对象,而且还要编写繁琐的样板代码(boilerplate coding)。而Groovy对这两个Java对象做了简单封装,添加了一些额外的实用方法,并给出一个简化的新的语法和3个新的操作符。

Groovy中,您可用slashy(斜线)语法“/../”定义字符串。这样以来便可避免在Java正则表达式中使用过多的反斜线。例如:

  1. assert (/Hello World/ in String)  
  2. assert (/Hi \there/ == 'Hi \\there')  

Groovy新增的第1个正则表达式操作符便是模式操作符(~),它使得字符串被编译成一个Pattern实例。例如:

  1. p = ~/\b[a-zA-Z]\b/ 

也可使用Java实现,如:

  1. import java.util.regex.*  
  2. Pattern p = Pattern.compile("\\b[a-zA-Z]\\b");  

表3.1中列出了常用的正则表达式模式及含义。完整的正则表达式清单可参考Pattern API文档,http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html

表3.1 常用的正则表达式模式

模式 含义
 
a?
 尽可能匹配1次a,也可以不匹配
 
a*
 表达式尽可能的多匹配a,最少可以不匹配
 
a+
 尽可能的多匹配a,至少匹配1次
 
a|b
 匹配a或b
 
(ab)
 分组
 
.
 匹配任意一个字符
 
[abc]
 匹配a,b或c
 
[^abc]
 匹配除了a,b或c的任意一个字符
 
[a-z]
 匹配a到z之间的任意一个字母
 
\d
 任意一个数字,0-9 中的任意一个
 
\s
 空格、制表符、换页符等空白字符的其中任意一个
 
\w
 任意一个字母或数字或下划线,也就是 A-Z,a-z,0-9,_ 中任意一个
 
\b
 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
 
^
 与字符串开始的地方匹配,不匹配任何字符
 
$
 与字符串结束的地方匹配,不匹配任何字符

第2个操作符是查找操作符(=~),它负责从左边的字符串和右边的模式来创建一个Matcher对象。

  1. import java.util.regex.Matcher  
  2. def matcher = "Groovy" =~ /G.*/  
  3. assert matcher in Matcher  
  4. assert matcher.matches()  

同理,其Java实现,如:

  1. import java.util.regex.*;  
  2. Pattern pattern = Pattern.compile("G.*");  
  3. Matcher matcher = pattern.matcher("Groovy");  
  4. matcher.matches();  

您可把Matcher对象看作一个二维矩阵。第1维表示每一个与模式相匹配的字符串;第2维表示每个匹配内的捕获组(capture group),详见清单3.2中的例子。

清单3.2 Using Regexes Groups with Matcher

  1. def text = """  
  2. Lorem 1:30 PM ipsum dolor 12:00 PM sit amet, consectetuer adipiscing elit.  
  3. """  
  4.  
  5. def HOUR = /10|11|12|[0-9]/  
  6. def MINUTE = /[0-5][0-9]/  
  7. def AM_PM = /AM|PM/  
  8. def time = /($HOUR):($MINUTE) ($AM_PM)/  
  9.  
  10. def matcher = text =~ time  
  11.  
  12. assert matcher[0] == ["1:30 PM""1""30""PM"//First Match  
  13.  
  14. assert matcher[0][0] == "1:30 PM" //First match group in the first match  
  15. assert matcher[0][1] == "1" //Second match group in the first match (HOUR)  
  16. assert matcher[0][2] == "30" //Third match group in the first match (MINUTE)  
  17. assert matcher[0][3] == "PM" //Fourth match group in the first match (AM_PM)  
  18.    
  19. assert matcher[1] == ["12:00 PM""12""00""PM"//Second Match  
  20. assert matcher[1][0] == "12:00 PM" //First match group in the second match  
  21. assert matcher[1][1] == "12" //Second match group in the second match (HOUR)  
  22. assert matcher[1][2] == "00" //Third match group in the second match (MINUTE)  
  23. assert matcher[1][3] == "PM" //Fourth match group in the second match (AM_PM) 

***一个是匹配操作符(==~),该操作符返回一个Boolean值,说明操作符左侧的整个字符串是否右侧的模式相匹配,例如:

  1. assert "Groovy" ==~ /G.*/  
  2. assert 123 ==~ /\d+/  
  3. assert !123 ==~ /\D+/  

正则表达式也可与String的replace*形式的方法(如replaceFirst等)结合使用。例如:

  1. //把***次出现的数字替换为“To”   
  2. assert "Welcome To Groovy" == "Welcome 2 Groovy".replaceFirst(/\d/, "To")  

GDK String还提供了一个可接受闭包的replace方法,该闭包可用来操作每个捕捉组(captured group),例如

  1. //把所有的“Groovy”转换为大写形式  
  2. "Hello GROOVY, GROOVY rocks" == "Hello Groovy, Groovy rocks" 
  3. .replaceAll("Groovy") {Object[] it ->it[0].toUpperCase()}  

您可以使用grep方法,该方法利用正则表达式筛选一个集合,并返回集合中满足给定过滤条件的元素。例如:

  1. //返回集合中以“G”开头的元素  
  2. assert ["Groovy"] == ["Groovy","Rocks"].grep(~/G.*/)  

【编辑推荐】

  1. 在Groovy中使用字符串
  2. Groovy脚本文件中的静态main方法
  3. 基于JVM的语言正在开始流行
  4. 专题:Groovy开发技术
  5. 专题:Scala编程语言
责任编辑:yangsai 来源: JavaEye博客
相关推荐

2010-03-25 18:25:36

Python正则表达式

2012-05-08 13:29:01

VB

2018-09-27 15:25:08

正则表达式前端

2020-09-04 09:16:04

Python正则表达式虚拟机

2009-03-16 14:01:24

正则表达式函数SQL

2009-09-16 13:14:10

Ereg正则表达式

2020-11-04 09:23:57

Python

2011-08-23 17:46:09

LUA正则表达式模式

2009-09-16 17:15:57

正则表达式引擎

2022-01-04 11:35:03

Linux Shel正则表达式Linux

2016-11-10 16:21:22

Java 正则表达式

2023-09-13 08:12:45

2021-01-27 11:34:19

Python正则表达式字符串

2009-09-16 18:19:34

正则表达式组

2017-05-12 10:47:45

Linux正则表达式程序基础

2009-02-18 09:48:20

正则表达式Java教程

2019-07-17 15:45:47

正则表达式字符串前端

2022-03-28 06:19:14

正则表达式开发

2011-06-02 12:34:16

正则表达式

2011-05-11 17:40:30

PHP正则表达式
点赞
收藏

51CTO技术栈公众号