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おそらく、文字列内のどこかに一致が見つかった場合に true を返す のfind()代わりに使用することをお勧めします。matches()

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 で を呼び出すことによって boolean を強制するのとif(matcher)同じです。これは、次のような構文をサポートするために行われますMatcherfind()

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

ただし、あなたの場合Matcher、括弧で囲まれたグループを抽出するには、実際の参照が必要です。

于 2013-07-02T12:16:31.767 に答える