用于正则表达式匹配的Groovy语法

2w3rbyxf  于 2023-08-02  发布在  其他
关注(0)|答案(4)|浏览(119)

以下Perl代码的Groovy等效项是什么?

my $txt = "abc : groovy : def";
if ($txt =~ / : (.+?) : /) {
  my $match = $1;
  print "MATCH=$match\n"; 
  # should print "MATCH=groovy\n"
}

字符串
我知道有不止一种方法可以做到这一点(包括常规的Java方法),但是什么是“Groovy方法”呢?
这是一种方法,但感觉有点笨拙--尤其是数组表示法(m[0][1]),感觉有点奇怪。有没有更好的办法?如果不是,请描述m[0][1]背后的逻辑。

def txt = "java : groovy : grails"
if ((m = txt =~ / : (.+?) :/)) {
  def match = m[0][1]
  println "MATCH=$match"
}

ljsrvy3e

ljsrvy3e1#

m[0]是第一个匹配对象。
m[0][0]是这场比赛中匹配的所有内容。
m[0][1]是这场比赛的第一个捕获。
m[0][2]是这场比赛中的第二个捕获。
根据我所读到的内容(我不会用Groovy编程,也没有现成的拷贝),给定

def m = "barbaz" =~ /(ba)([rz])/;

字符串
m[0][0]将是"bar"
m[0][1]将是"ba"
m[0][2]将是"r"
m[1][0]将为"baz"
m[1][1]将为"ba"
m[1][2]将为"z"
我无法忍受不知道自己是否正确,所以我下载了groovy并写了一个例子:

def m = "barbaz" =~ /(ba)([rz])/;

println "m[0][0] " + m[0][0]
println "m[0][1] " + m[0][1]
println "m[0][2] " + m[0][2]
println "m[1][0] " + m[1][0]
println "m[1][1] " + m[1][1]
println "m[1][2] " + m[1][2]

cpjpxq1n

cpjpxq1n2#

这是我能实现的与Perl代码最接近的匹配:

def txt = "abc : groovy : def"
if ((m = txt =~ / : (.+?) : /)) {
  def match = m.group(1)
  println "MATCH=$match"
}

// Prints:
// MATCH=groovy

字符串

gorkyyrv

gorkyyrv3#

这是我对如何使用Groovy语法做到这一点的最佳理解(但也可以参见lfaraone的回应):

import java.util.regex.Matcher

def txt = 'abc : groovy : def'
if (txt =~ ~/ : (.+?) : /) {
    def match = Matcher.lastMatcher[0][1]
    println "MATCH=$match"
}

字符串

yfwxisqw

yfwxisqw4#

请注意,如果要使用group()方法检索组匹配,则需要将匹配代码放入条件中。
使用以下代码:

def subject = "CN=mycn,EMAIL=mycn@foo.com"
if (match1 = subject =~ /CN=(.*?),.*/) {
    println match1.group(1)
}

def match2 = subject =~ /CN=(.*?),.*/
println match2.group(1)

字符串
运行上述代码(在Groovy 3.09,JVM 17.0.1中)的输出是:

mycn

Caught: java.lang.IllegalStateException: No match found
java.lang.IllegalStateException: No match found
    at java_util_regex_MatchResult$group.call(Unknown Source)
    at jdoodle.run(jdoodle.groovy:7)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)


所以match1.group(1)成功并返回正确的匹配mycn
match2.group(2)导致IllegalStateException
所以match示例只在条件语句中被完全求值。

相关问题