程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 在Groovy中編寫正則表達式

在Groovy中編寫正則表達式

編輯:關於JAVA

與Java相比, 在Groovy中編寫正則表達式(regexes)簡直是一種樂趣。在 Java中, regexes編程不僅需處理Pattern和Matcher對象,而且還要編寫繁瑣的 樣板代碼(boilerplate coding)。而Groovy對這兩個Java對象做了簡單封裝, 添加了一些額外的實用方法,並給出一個簡化的新的語法和3個新的操作符。

Groovy中,您可用slashy(斜線)語法“/../”定義字符串。這樣以來便可避 免在Java正則表達式中使用過多的反斜線。例如:

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

Groovy新增的第1個正則表達式操作符便是模式操作符(~),它使得字符串被 編譯成一個Pattern實例。例如:

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

也可使用Java實現,如:

import java.util.regex.*
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對象。

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

同理,其Java實現,如:

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

您可把Matcher對象看作一個二維矩陣。第1維表示每一個與模式相匹配的字符 串;第2維表示每個匹配內的捕獲組(capture group),詳見清單3.2中的例子。

清單3.2 Using Regexes Groups with Matcher

def text = """
Lorem 1:30 PM ipsum dolor 12:00 PM sit amet, consectetuer adipiscing elit.
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"] //First Match
assert matcher[0][0] == "1:30 PM" //First match group in the first match
assert matcher[0][1] == "1" //Second match group in the first match (HOUR)
assert matcher[0][2] == "30" //Third match group in the first match (MINUTE)
assert matcher[0][3] == "PM" //Fourth match group in the first match (AM_PM)
assert matcher[1] == ["12:00 PM", "12", "00", "PM"] //Second Match
assert matcher[1][0] == "12:00 PM" //First match group in the second match
assert matcher[1][1] == "12" //Second match group in the second match (HOUR)
assert matcher[1][2] == "00" //Third match group in the second match (MINUTE)
assert matcher[1][3] == "PM" //Fourth match group in the second match (AM_PM)

最後一個是匹配操作符(==~),該操作符返回一個Boolean值,說明操作符左 側的整個字符串是否右側的模式相匹配,例如:

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

正則表達式也可與String的replace*形式的方法(如replaceFirst等)結合使 用。例如:

//把第一次出現的數字替換為“To”
assert "Welcome To Groovy" == "Welcome 2 Groovy".replaceFirst(/\d/, "To")

GDK String還提供了一個可接受閉包的replace方法,該閉包可用來操作每個 捕捉組(captured group),例如

//把所有的“Groovy”轉換為大寫形式
"Hello GROOVY, GROOVY rocks" == "Hello Groovy, Groovy rocks"
.replaceAll("Groovy") {Object[] it ->it[0].toUpperCase()}

您可以使用grep方法,該方法利用正則表達式篩選一個集合,並返回集合中滿 足給定過濾條件的元素。例如:

//返回集合中以“G”開頭的元素
assert ["Groovy"] == ["Groovy","Rocks"].grep(~/G.*/)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved