2011-07-30 1 views
0

Ok, vous pourriez dire que c'est un article en double, mais c'est différent.Java - Analyse de chaîne ou split() bug en utilisant plusieurs délimiteurs

Je travaille sur un programme qui travaille sur une sorte de suppression des délimiteurs spécifiés par l'utilisateur. Mon programme fonctionne si le délimiteur n'est qu'un seul caractère (spécial ou non). Toutefois, si l'entrée utilisateur est une chaîne, elle supprime tous les caractères du délimiteur de la chaîne de message.

ex. Chaîne message = "ab \ nc [d] e {fMardk1g (h) i} j"; sortie sera: bcefghij mais le résultat attendu est abcdefghij

Je suis nouveau en utilisant la classe modèle, donc je ne sais pas où réside le problème.

Voici le code en question (je l'ai mis dans une classe d'essai afin que je puisse isoler le problème):

importation java.util.regex.Pattern;

public class ParsingTest { 
    public static void main(String[] args) { 
     String[] delimiters = { "Mardk1", "\n", "[", "]", "{", "}", "(", ")" }; 
     StringBuilder regexp = new StringBuilder(""); 
     regexp.append("["); 
     for(String s : delimiters) { 
      regexp.append("["); 
      regexp.append(Pattern.quote(s)); 
      regexp.append("]"); 
     } 
     regexp.append("]"); 

     String message = "ab\nc[d]e{fMardk1g(h)i}j"; 
     StringBuilder result = new StringBuilder(""); 
     String[] a = message.split(regexp.toString()); 
     for(String string : a) { 
      result.append(string); 
     } 
     System.out.println(result); 
     for(String str: a) System.out.print(str); 
     System.out.println(); 
    } 
} 
+0

Votre regex généré contiendra '[Mardk1]' qui délimitent par l'un quelconque des caractères 'M, a, r, d, k ou 1 ', et c'est pourquoi vous ne voyez pas de caractère' a' dans votre sortie. – rodion

Répondre

1

Vous utilisez le mauvais type de construction de regroupement. Vous construisez un modèle comme [xyz] qui correspondra à n'importe quel caractère x, y ou z. Vous souhaitez associer plusieurs chaînes complètes, vous souhaitez donc utiliser le groupage de style () normal et l'opérateur d'alternance (|). Jetez un oeil à la documentation Pattern pour plus de détails.

essayer ceci pour construire l'expression rationnelle:

for(String s : delimiters) { 
    // We don't want to start with (| 
    if (regexp.length() > 1) 
    { 
     regexp.append("|"); 
    } 
    regexp.append(Pattern.quote(s)); 
} 
+0

oh, tnx ... vous avez résolu mon problème. Pourquoi il est nécessaire d'avoir "|" entre les mots – JinShin

+0

@JinShin: C'est l'opérateur d'alternance pour dire cela correspond à ceci ou cela ou (etc). Donc "(ab | cd | ef)" correspondra à "ab", "cd" ou "ef". –

+0

oh, tnx à nouveau. Je comprends maintenant. – JinShin

Questions connexes