2017-08-21 18 views
0

groovyでこれを実現する方法はありますか?私は他の人が(*.xlsxまたは.xmlで終わるような)特定のパターンに一致している必要がありながら、そのフィールドのいくつかは重要ではありませんswitch文でリストデータを確認したいgroovy switch文のリストマッチング

def list1 = ['trs', 'file.xlsx', 'xxx'] 
def list2 = ['rls', 'file.xml', 'yyy'] 

def switchCheck(list) { 
    switch (list) { 
     case ['trs', /* matches pattern *.xlsx */ , /* any value */]: 
      println "trs message" 
      break 
     case ['rls', /* matches pattern *.xml */ , /* any value */]: 
      println "rls message" 
      break 
     default: 
      println "no match" 
      break 
    } 
} 

switchCheck(list1) 
switchCheck(list2) 

+0

regexの[this](http://mrhaki.blogspot.in/2009/09/groovy-goodness-using-regular.html)と[this](http://mrhaki.blogspot.in/ 2009/08/groovy-goodness-switch-statement.html)を参照してください。 – Rao

+0

@Rao:実際には正規表現ではなく、グロブパターンです。 – aristotll

+0

私は '['trs'、〜/ match extension /、〜/ any any /]'のようなものが必要です。 – lapots

答えて

2

私はデモを作成例は猿のパッチが悪いためです。 実行時にisCaseを変更することができます。 。

isCaseは方法、switch文でグルーヴィーな呼び出しです(Javaのとは異なる)

ただ、このような呼び出し:

... // You don't need to modify switchCheck method. 
    def list2 = ['rls', 'file.xml', 'yyy'] 
List.metaClass.isCase = { Object switchValue -> 
    if (!switchValue in List && switchValue.size() == 3) { 
     false 
    } else { 
     switchValue.first() == delegate.first() && (switchValue[1]) in ~(createRegexFromGlob(delegate[1])) 
    } 

} 
switchCheck(list1) 

createRegexFromGlobはhereからコピーされます。

+0

globの代わりにraw正規表現を使用しても問題はありません。私はちょうど 'リスト 'の場合のための素晴らしい1ライナーをしたいです – lapots

+0

'〜(createRegexFromGlob(delegate [1])) 'の代わりに'〜(delegate [1]) 'を使用してください。' – aristotll

+0

' trs '、〜/ xlsx /、〜/ * /] '何か? – lapots