2010-05-17 11 views
5

Ho la seguente stringa "3/4Ton". Voglio dividerlo come ->divide una stringa in base al modello in java - lettere maiuscole e numeri

word [1] = 3/4 e word [2] = Ton.

In questo momento il mio pezzo di codice simile a questo: -

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

Svolge il compito necessario di dividere la stringa in base a lettere maiuscole, come: -

String = MachineryInput

word [1] = Machinery, word [2] = Input

L'unico problema è che non conserva, numeri o abbreviazioni o sequenze di lettere maiuscole che non sono pensati per essere parole separate. Qualcuno potrebbe aiutarmi con il mio problema di codifica delle espressioni regolari.

Grazie in anticipo ...

+0

Quello che inizia una "parola"? Non può essere una lettera maiuscola o un numero, poiché "3/4" sarebbe costituito da due parole: "3 /" e "4". Penso che sia necessario definire le regole in modo più preciso prima di ottenere una buona risposta. –

+0

Un numero o una lettera maiuscola. Quello di cui sono confuso è come unire entrambe le mie esigenze in un'unica espressione regolare? Ho bisogno di sapere quale sarebbe il modo migliore per usare le espressioni regolari in modo che il mio programma sia in grado di dividere una stringa basata su numeri o lettere maiuscole come punti di partenza. Grazie –

risposta

4

Puoi Effettivamente fare questo in solo regex con sguardo avanti e guardare dietro (vedi costrutti speciali su questa pagina: 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); 
} 

Che cosa si può fare è qualcosa di simile:

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

Sean

+0

sto ottenendo un errore di sintassi in questa linea "| (= \\ d?) (<= [\\ p {Inferiore}]?)" non so perché. Mi potete aiutare per favore? –

+0

hai ragione, c'è un + mancante (mi sono perso quando ho aggiunto i documenti). Lo aggiungerò subito. –

+0

grazie mille per il tuo aiuto! –

2

Utilizzando regex sarebbe bello qui. Scommetto che c'è anche un modo per farlo, anche se non sono un tipo di regex swing-in-on-a-vine, quindi non posso aiutarti. Tuttavia, c'è qualcosa che non puoi evitare - qualcosa, da qualche parte ha bisogno di ricominciare da capo con il tuo String. Si potrebbe fare questo "da soli" in questo modo:

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]); 
} 

ho provato con il seguente test driver:

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); 
} 

e ottenuto il seguente risultato:

3/4 
Ton tru 
Ck 
Start with 
Capital 
+0

Grazie per il vostro aiuto. Mi dà sicuramente un senso di direzione e mi ha mostrato un approccio diverso. –

Problemi correlati