Groovy正则表达式 - 它与“普通”正则表达式不同吗?

时间:2013-07-02 12:06:11

标签: regex groovy

我遇到了生成在Groovy中运行的正则表达式的问题。

我的目标是:给出一个像:

这样的字符串

/products/prodA/index-tab2.html

获取匹配,如果最后一个字符串后面的字符串返回匹配“-tab”n“.html”

我最初的尝试是

([^\/]+)(?<=-tab[0-9]\.html$)

我在这里测试http://gskinner.com/RegExr/对照以下测试数据:

/products/prodA/index-tab2.html
/products/prodA/index.html 
/products-tab2/prodA/index-tab2.html

并在“index-tab2.html”上获得了匹配 - 到目前为止一直很好(或者我认为)。

下一步是将它放入Groovy:

log.info("KPF: pageName is ${pageName} ")

def matcher = pageName =~ /([^\/]+)(?<=tab[0-9]\.html$)/
if (matcher.matches()) {
  log.debugEnabled && log.debug("KPF: Filename has tab = $filename")
} else {
  log.debugEnabled && log.debug("KPF: Filename does not have tab")
}

然而,当我用输入

测试代码时

/products/prodA/index-tab2.html (没有尾随空格 - 经过验证 - 但不在此示例中)

我得到以下记录:

2013-07-02~12:51:10 INFO  (xxx.site.controllers.PageController @ line 35) KPF: pageName is /products/prodA/index-tab2.html  (xxx)
2013-07-02~12:51:10 DEBUG (xxx.site.controllers.PageController @ line 44) KPF: Filename does not have tab (xxx)

那么正则表达式是“错误的”,我如何得到我需要的匹配?

1 个答案:

答案 0 :(得分:2)

matcher.matches()要求整个字符串与正则表达式匹配,因此如果true根本不包含斜杠,则只返回pageName。您可能希望使用find()而不是matches(),如果在字符串中的任何位置找到匹配项,则返回true。

log.info("KPF: pageName is ${pageName} ")

def matcher = pageName =~ /([^\/]+)(?<=tab[0-9]\.html$)/
if (matcher.find()) {
  log.debugEnabled && log.debug("KPF: Filename has tab = ${matcher.group(1)}")
} else {
  log.debugEnabled && log.debug("KPF: Filename does not have tab")
}

或者确实只是if(matcher)作为Matcher通过调用find()在Groovy中强制布尔。这样做是为了支持

之类的语法
if(pageName =~ /..../)

但在您的情况下,您需要引用实际的Matcher才能提取带括号的组。