【问题标题】:Groovy syntax for regular expression matching正则表达式匹配的 Groovy 语法
【发布时间】:2009-04-18 22:43:40
【问题描述】:

以下 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"
}

【问题讨论】:

    标签: regex groovy


    【解决方案1】:

    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]
    

    【讨论】:

    • 感谢您的回复。您能否举例说明何时可能有多个匹配对象(m[1])?
    • 所以有一个隐含的/g 用于多重匹配?呵呵
    【解决方案2】:

    这是我能达到的与 Perl 代码最接近的匹配:

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

    【讨论】:

    • 这会打印什么?肉眼看起来很混乱。
    • 这是如何工作的?这是做什么的?肉眼看起来很混乱。
    • 为什么将m = txt =~ / : (.+?) : / 部分包装在 if 语句中?
    • @Sajuuk 因为=~ 是一个正则表达式运算符,如果找不到任何内容,m 将为空。
    • 为什么((m=...)) 中有双括号。我可以看到没有错误,但我不明白为什么:MultipleCompilationErrorsException: startup failed: .../test.groovy: 2: expecting ')', found '=' @
    【解决方案3】:

    这是我对如何使用 Groovy 语法执行此操作的最佳理解(但也请参阅 lfaraone 的回复):

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

    【讨论】:

    • 感谢您的回复!我认为如果没有匹配项,您的代码将因 IndexOutOfBoundsException 而失败。我在看到你的回复之前编辑了我的帖子 - 所以你可能想重新访问你的帖子。请参阅有关 m[0][1] 表示法的资料。
    • 谢谢,我已经更新了我的答案。此外,Java 中的 Matcher 可以有多个匹配项。 (想想 Perl 匹配的 /g 标志。)第一个索引允许您指定您关心的匹配。
    猜你喜欢
    • 2012-04-15
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多