2010-03-21 7 views
2

Je dois créer une expression régulière pour une conversion de chemin. Exemple de chemin sontexpression régulière java

//name:value /name:value // name:value 
/name:value /name:value 
/name:value//name:value 

chose est de savoir comment vérifier // ou/au début ou au milieu de la chaîne et comment puis-je préciser que le nom peut contenir tout cela a-zA-Z et _

Le chemin contient également des espaces blancs.

Répondre

4

Cela devrait aider:

String s = "//name:value /name:value // name:value"; 
Pattern p = Pattern.compile("//?\\s*(\\w+):(\\w+)\\s*"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.printf("%s = '%s'%n", m.group(1), m.group(2)); 
} 

Quelques notes:

  • Il est supposé que le / ou // peut délimiter name:value paires;
  • L'espace blanc facultatif après / ou // et après name:value est ignoré; Les deux name et value sont capturés. Vous ne dites pas ce que vous voulez capturer. Ajustez les parenthèses si nécessaire;
  • Les deux name et value consistent en A-Z, a-z, 0-9 ou _ (c'est ce que signifie \w).

Si vous ne voulez pas trouver les valeurs mais simplement tester la validité dans son ensemble:

String s = "//name:value /name:value // name:value"; 
if (s.matches("(//?\\s*\\w+:\\w+\\s*)+")) { 
    // it fits 
} 
1

Que exaclty voulez-vous archieve? Voulez-vous juste vérifier si une entrée est un chemin valide, ou voulez-vous extraire des groupes correspondants pour une conversion ultérieure?

Dans tous les cas, un motif qui correspondrait à une chaîne commençant par/ou // et un nom et une valeur consistant en une zA-Z et _ serait:

(//?\s*[A-Za-z_]+:[A-Za-z_]+\s*)+ 
0

Vous pouvez également utiliser replaceAll à faites la transformation si c'est assez simple.

String strings = "//cello:Yo-Yo Ma/violin : Itzhak Perlman"; 
    System.out.println(strings.replaceAll(
     "//?\\s*(\\w+)\\s*:\\s*(.*?)\\s*(?=/|$)", 
     "[$2] on [$1]\n" 
    )); 
    // "[Yo-Yo Ma] on [cello]" 
    // "[Itzhak Perlman] on [violin]"