2009-02-05 10 views
0

J'utilise Java matcher pour essayer de correspondre à ce qui suit:expression régulière pour analyser la chaîne d'option

@tag TYPE_WITH_POSSIBLE_SUBTYPE -PARNAME1=PARVALUE1 -PARNAME2=PARVALUE2: MESSAGE 

Le TYPE_WITH_POSSIBLE_SUBTYPE se compose de lettres avec des périodes.

Chaque paramètre doit être composé de lettres, et chaque valeur doit être composée de chiffres/lettres. Il peut y avoir 0 ou plusieurs paramètres. Immédiatement après la dernière valeur du paramètre vient le point-virgule, un espace, et le reste est considéré comme un message.

Tout doit être groupé.

Mon regexp actuelle (comme Java littérale) est:

(@tag)[\\s]+?([\\w\\.]*?)[\\s]*?(-.*=.*)*?[\\s]*?[:](.*) 

Cependant, je continue à obtenir tous les paramètres comme un groupe. Comment puis-je obtenir chacun en tant que groupe séparé, si c'est même possible?

Je ne travaille pas beaucoup avec les expressions rationnelles, donc je gâche toujours quelque chose.

Répondre

2

Si vous souhaitez capturer chaque paramètre séparément, vous devez avoir un groupe de capture pour chacun d'entre eux. Bien sûr, vous ne pouvez pas faire cela parce que vous ne savez pas comment l'homme y paramètres il y aura. Je recommande une approche différente:

Pattern p = Pattern.compile("@tag\\s+([^:]++):\\s*(.*)"); 
Matcher m = p.matcher(s); 
if (m.find()) 
{ 
    String[] parts = m.group(1).split("\\s+"); 
    for (String part : parts) 
    { 
    System.out.println(part); 
    } 
} 
System.out.printf("message: %s%n", m.group(2)); 

Le premier élément du tableau est le nom de votre type et le reste (s'il y en a plus) sont les paramètres.

+0

Merci. J'ai en fait quelque chose comme ça en ce moment (où je diviser les paramètres, mais j'espérais qu'il y avait un moyen de se retrouver avec des groupes de longueur variable ... – Uri

+0

Autant que je sache, .NET est la seule saveur regex qui permet vous accédez à toutes les correspondances pour un groupe de capture, par opposition à la dernière. –

1

Essayez ceci (vous devrez peut-être ajouter supplémentaire « \ » pour le faire fonctionner dans une chaîne

(@tag)\s*(\w*)\s*(-[\w\d]*=[\w\d]*\s*)*:(.*) 

Soit dit en passant, je très recommande ce site pour vous aider à construire des expressions régulières.: RegexPal

Questions connexes