2012-10-31 4 views
1

J'ai une carte similaire à ceci.Comment utiliser regex dans la carte groovy

 xxx-10.name ='welcome' 
    xxx-10.age ='12' 
    xxx-10.std ='2nd' 

    xxx-12.name ='welcome' 
    xxx-12.age ='12' 
    xxx-12.std ='2nd' 

    yyy-10.name ='welcome' 
    yyy-10.age ='12' 
    yyy-10.std ='2nd' 

    yyy-12.name ='welcome' 
    yyy-12.age ='12' 
    yyy-12.std ='2nd' 

utilisateur wen donne xxx je dois retourner la sous-carte avec toutes les entrées xxx, quel que soit le nombre qui lui est associé. Existe-t-il un moyen d'y parvenir en utilisant regex? ou sans itération sur les touches?

subMap je peux obtenir l'aide de l'utilitaire ..

Répondre

3

Cela devrait faire ce que vous voulez.

def fileContents = '''xxx-10.name ='welcome' 
        |xxx-10.age ='12' 
        |xxx-10.std ='2nd' 
        |xxx-12.name ='welcome' 
        |xxx-12.age ='12' 
        |xxx-12.std ='2nd' 
        |yyy-10.name ='welcome' 
        |yyy-10.age ='12' 
        |yyy-10.std ='2nd' 
        |yyy-12.name ='welcome' 
        |yyy-12.age ='12' 
        |yyy-12.std ='2nd'''.stripMargin() 

// Get a Reader for the String (this could be a File.withReader) 
Map map = new StringReader(fileContents).with { 
    // Create a new Properties object 
    new Properties().with { p -> 
    // Load the properties from the reader 
    load(it) 
    // Then for each name, inject into a map 
    propertyNames().collectEntries { 
     // Strip quotes off the values 
     [ (it): p[ it ][ 1..-2 ] ] 
    } 
    } 
} 

findByPrefix = { pref -> 
    map.findAll { k, v -> 
    k.startsWith(pref) 
    } 
} 

findByPrefix('xxx') 

Croisons les doigts que vous ne supprimez pas cette question ;-)

+0

Comme ur dernière ligne;) – Jeevi

4

Il y a une fonction de filtre pour les collections en groovy. Voir API

def result = [a:1, b:2, c:4, d:5].findAll { it.value % 2 == 0 } 
assert result.every { it instanceof Map.Entry } 
assert result*.key == ["b", "c"] 
assert result*.value == [2, 4] 

Dans votre cas lorsque vous recherchez des yourSearchString utilisant String.startsWith():

map.findAll { it.key.startsWith(yourSearchString) } 
+1

Il vaut mieux utiliser 'startsWith' comme c'est ce qu'il est intéressé par ce que je fais dans [ réponse d'il ya 10 minutes] (http://stackoverflow.com/a/13156735/6509) –

+1

Merci pour l'indice. J'ai édité le post. – mana