1

我在生成适用于 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)

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

4

1 回答 1

3

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")
}

或者实际上只是通过调用在 Groovy 中强制转换为布尔if(matcher)值。这样做是为了支持类似的语法Matcherfind()

if(pageName =~ /..../)

但在您的情况下,您需要参考实际Matcher值才能提取括号中的组。

于 2013-07-02T12:16:31.767 回答