2017-03-07 2 views
0

Ich habe eine sehr lange Java-Zeichenfolge und ich versuche, die Hälfte der Vorkommen eines bestimmten Wortes mit seiner Rückseite zu ersetzen.Regex replaceAll mit Substitutionswahrscheinlichkeit

Also, wenn die Zeichenfolge "Hallo mein Freund Hallo" ist, sollte die Ausgabe, wenn ich es mit dem Wort "Hallo" ausführen, etwas wie "Hallo mein Freund olleh" geben.

Ich weiß, dass ich ein Wort mit

new StringBuilder(str).reverse().toString() 

rückgängig machen kann und dass ich

Str.replaceAll("hello", "olleh") 

die Zeichenfolge zu ändern, verwenden können. Aber wie kann ich replaceAll nur die Hälfte der Vorkommen von Hallo ersetzen? Gibt es eine Möglichkeit, eine Wahrscheinlichkeit in replaceAll einzugeben oder den Text zu durchlaufen und bei jedem Auftreten zu stoppen?

+0

Ihr Problem ist lose definiert. Muss es genau die Hälfte sein? Wenn ja, wie wird entschieden, welches Ereignis ersetzt werden soll und welches nicht ersetzt werden soll? Wenn es nicht genau eine Hälfte ist, wie genau kann das Ergebnis sein? Etc – Dici

+0

@Dici Ich meinte genau die Hälfte, aber eine ungleichmäßige Aufteilung ist auch in Ordnung – Alessandro

+0

Hinweis: Wenn Sie Zeichenfolgen ohne Regex-Sonderzeichen ersetzen, verwenden Sie 'String.replace', nicht' String.replaceAll'. –

Antwort

4

Wenn Sie die Hälfte der Vorkommen ersetzen möchten, ist eine Möglichkeit, dies zu tun, ohne die Anzahl der Vorkommen im Voraus zu zählen, ev. Zu ersetzen ein anderes Vorkommen (eins überspringen, eins ersetzen, eins überspringen, eins ersetzen ...).

String replaceHalf(String input, String search) { 
    String reversed = new StringBuilder(search).reverse().toString(); 
    StringBuilder sb = new StringBuilder(input); 
    int pos = -search.length(); 
    while (true) { 
    // Find the next occurrence... 
    pos = input.indexOf(search, pos + search.length()); 
    if (pos == -1) break; 

    // ...but ignore it, and find the next occurrence. 
    pos = input.indexOf(search, pos + search.length()); 
    if (pos == -1) break; 

    sb.replace(pos, pos + search.length(), reversed); 
    } 
    return sb.toString(); 
} 
+0

clevere Lösung! –

0

1 - zählen, wie viel String "Hallo"

Occurrences of substring in a string

How about using StringUtils.countMatches from Apache Commons Lang? 

String str = "helloslkhellodjladfjhello"; 
String findStr = "hello"; 

System.out.println(StringUtils.countMatches(str, findStr)); 

2 zu sehen - dann auf N iterieren/2 mit

replaceFirst oder indexOf, und verwenden Sie Ihr Wahrscheinlichkeitsmodell. ..