2010-05-17 8 views
5

je la chaîne suivante « 3/4Ton ». Je veux partager comme ->découper une chaîne basée sur le modèle en java - lettres majuscules et chiffres

mot [1] = 3/4 et mot [2] = Ton.

En ce moment, mon morceau de code ressemble à ceci: -

Pattern p = Pattern.compile("[A-Z]{1}[a-z]+"); 
Matcher m = p.matcher(line); 
while(m.find()){ 
    System.out.println("The word --> "+m.group()); 
    } 

Il exécute la tâche nécessaire de diviser la chaîne en fonction des lettres majuscules comme: -

String = MachineryInput

mot [1] = machines, mot [2] = entrée

Le seul problème est qu'il ne conserve pas, des chiffres ou des abréviations ou des séquences de lettres majuscules qui ne sont pas destinés à être des mots séparés. Quelqu'un pourrait-il m'aider avec mon problème de codage d'expression régulière.

Merci d'avance ...

+0

Ce qui commence un "mot"? Il ne peut s'agir d'une lettre majuscule ou d'un chiffre, car "3/4" serait deux mots, "3 /" et "4". Je pense que vous devez définir vos règles plus précisément avant d'obtenir une bonne réponse. –

+0

Un nombre ou une lettre majuscule. Ce que je suis confus est de savoir comment puis-je fusionner mes deux exigences dans une expression régulière? J'ai besoin de savoir quelle serait la meilleure façon d'utiliser les expressions régulières afin que mon programme puisse diviser une chaîne basée sur des nombres ou des majuscules comme points de départ. Merci –

Répondre

4

Vous pouvez en fait le faire en utilisant regex seul regarder vers l'avenir et regarder derrière (voir des constructions spéciales sur cette page: http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html)

/** 
* We'll use this pattern as divider to split the string into an array. 
* Usage: myString.split(DIVIDER_PATTERN); 
*/ 
private static final String DIVIDER_PATTERN = 

     "(?<=[^\\p{Lu}])(?=\\p{Lu})" 
       // either there is anything that is not an uppercase character 
       // followed by an uppercase character 

       + "|(?<=[\\p{Ll}])(?=\\d)" 
     // or there is a lowercase character followed by a digit 

     ; 

@Test 
public void testStringSplitting() { 
    assertEquals(2, "3/4Word".split(DIVIDER_PATTERN).length); 
    assertEquals(7, "ManyManyWordsInThisBigThing".split(DIVIDER_PATTERN).length); 
    assertEquals(7, "This123/4Mixed567ThingIsDifficult" 
         .split(DIVIDER_PATTERN).length); 
} 

Donc ce que vous pouvez faire est quelque chose comme ceci:

for(String word: myString.split(DIVIDER_PATTERN)){ 
    System.out.println(word); 
} 

Sean

+0

Je reçois une erreur de syntaxe à cette ligne "| (= \\ d?) (<= [\\ p {} inférieur]?)" ne sais pas pourquoi. Pouvez-vous m'aider s'il vous plaît? –

+0

vous avez raison, il y a un + manquant (s'est perdu quand j'ai ajouté docs). Je vais l'ajouter tout de suite. –

+0

merci beaucoup pour votre aide! –

2

L'utilisation de regex serait bien ici. Je parie qu'il y a un moyen de le faire aussi, bien que je ne sois pas un mec de regex de swing-on-a-vine donc je ne peux pas t'aider. Cependant, il y a quelque chose que vous ne pouvez pas éviter - quelque chose, quelque part a besoin de faire une boucle sur votre chaîne par la suite. Vous pouvez le faire « sur votre propre » comme ceci:

String[] splitOnCapitals(String str) { 
    ArrayList<String> array = new ArrayList<String>(); 
    StringBuilder builder = new StringBuilder(); 
    int min = 0; 
    int max = 0; 
    for(int i = 0; i < str.length(); i++) { 
     if(Character.isUpperCase(str.charAt(i))) { 
      String line = builder.toString().trim(); 
      if (line.length() > 0) array.add(line); 
      builder = new StringBuilder(); 
     } 
     builder.append(str.charAt(i)); 
    } 
    array.add(builder.toString().trim()); // get the last little bit too 
    return array.toArray(new String[0]); 
} 

Je l'ai testé avec le pilote d'essai suivant:

public static void main(String[] args) { 
    String test = "3/4 Ton truCk"; 
    String[] arr = splitOnCapitals(test); 
    for(String s : arr) System.out.println(s); 

    test = "Start with Capital"; 
    arr = splitOnCapitals(test); 
    for(String s : arr) System.out.println(s); 
} 

et a obtenu la sortie suivante:

3/4 
Ton tru 
Ck 
Start with 
Capital 
+0

Merci pour votre aide. Cela me donne un sens de l'orientation et m'a montré une approche différente. –

Questions connexes