我遇到了生成在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)
那么正则表达式是“错误的”,我如何得到我需要的匹配?
答案 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
才能提取带括号的组。