2017-04-18 2 views
2

Ich habe diese Art von InputJava ersetzen Zeichen mit Groß um (vor und nach) spezifischem Charakter

word w'ord wo'rd 

Ich brauche bei den Starts des Wortes beiden Zeichen in Großbuchstaben zu konvertieren und direkt nach dem ' Zeichen (was kann mehrfach vorkommen).

Der Ausgang I benötigen (das vorherige Beispiel verwendet wird) ist

word W'Ord Wo'Rd 

ich versuchte, mit einem einfachen Muster

s.replaceAll("(\\w)(\\w*)'(\\w)", "$1"); 

aber ich bin nicht in der Lage die Gruppe 1 und 3 in Großbuchstaben umzuwandeln


EDIT: Nachdem ich einen kleinen Fehler in der Hauptfrage entdeckt habe, ich @Wiktor Stribizew Code bearbeitet, um den Fall, den ich verpasst habe, einzubeziehen.

Matcher m = Pattern.compile("(\\w)(\\w*)'(\\w)").matcher(s); 
StringBuffer result = new StringBuffer(); 
while (m.find()) { 
    m.appendReplacement(result, m.group(1).toUpperCase() + m.group(2) + "'" + m.group(3).toUpperCase()); 
} 
m.appendTail(result); 
s = result.toString(); 

Antwort

9

Sie müssen Matcher#appendReplacement in Java zu verwenden, der Lage sein, das Spiel zu verarbeiten. Hier ein Beispiel:

String s = "word w'ord wo'rd"; 
StringBuffer result = new StringBuffer(); 
Matcher m = Pattern.compile("\\b(\\w)(\\w*)'(\\w(?:'\\w)*)").matcher(s); 
while (m.find()) { 
    m.appendReplacement(result, 
     m.group(1).toUpperCase()+m.group(2) + "'" + m.group(3).toUpperCase()); 
} 
m.appendTail(result); 
System.out.println(result.toString()); 
// => word W'Ord Wo'Rd 

Siehe Java demo

Muster schlüsselt nach:

  • \b - eine führende Wortgrenze
  • (\w) - Gruppe 1: ein einziges Wort char
  • (\w*) - Gruppe 2: null oder mehr Wörter Zeichen
  • ' - ein Apostroph
  • (\w(?:'\w)*) - Gruppe 3:
    • \w - ein Wort char
    • (?:'\w)* - null oder mehr Sequenzen von:
      • ' - ein Apostroph
      • \w - ein Wort char.

Nun, wenn Sie das Muster genauer machen möchten, können Sie die \w ändern, die angeblich mit \p{Ll} und die \w Kleinbuchstaben entsprechen, die jeden Buchstaben übereinstimmen mit \p{L} soll . Das Muster würde wie "(?U)\\b(\\p{Ll})(\\p{L}*)'(\\p{Ll}(?:'\\p{Ll})*)" aussehen - Sie riskieren jedoch, Buchstaben in Kleinbuchstaben (jene nach ') zu belassen, wenn es Großbuchstaben vor Kleinbuchstaben gibt (wie in wo'r'D's ->Wo'R'D's). (?U) ist ein Pattern.UNICODE_CHARACTER_CLASS Inline-Modifizierer, der \b Wortgrenze Unicode-aware macht.

+0

Diese in der Tat funktioniert. Wenn ich diesen Code ausführte und die Ausgabe in allen Zeilen sah, die ich konvertieren musste, entdeckte ich einen kleinen Fehler in der Hauptfrage. Ich habe jetzt die Hauptfrage angepasst, um den Fall zu berücksichtigen, den ich verpasst habe. –

+0

Fehler für String: \t String s = "wo'rd w'ord wo'r'd"; – Optional

+0

@DevilingMaster: Der gleiche Ansatz ist hier gültig: erfassen Sie, was Sie brauchen, in Gruppen, und bearbeiten Sie dann jede Gruppe innerhalb des 'while' Blocks. –

0

nicht so elegant wie @Wiktor Stribizew Beitrag oben, aber ein Versuch ohne Regex zu tun:

public class HelloWorld{ 

public static void main(String []args){ 
    String s ="word w'ord wo'r'd"; 
    System.out.println(upperCase(s,'\'')); 
} 
private static int x = 1; 
private static String upperCase(String originalString, char delimeter) 
{ 
    if(originalString.length()==1) 
    { 
     return originalString; 
    } 
    int indexOfDelimeter = originalString.indexOf(delimeter); 
    StringBuilder result = new StringBuilder(); 
    if(indexOfDelimeter<0) 
    { 
     return originalString; 
    } 
    String newBaseString = originalString.substring(indexOfDelimeter+2); 
    if(indexOfDelimeter==0) 
    { 
     result.append(delimeter).append(Character.toUpperCase(originalString.charAt(indexOfDelimeter+1))).append(newBaseString); 
    } 
    else 
    { 
     result.append(originalString.substring(0,indexOfDelimeter-1)).append(Character.toUpperCase(originalString.charAt(indexOfDelimeter-1))).append(delimeter).append(Character.toUpperCase(originalString.charAt(indexOfDelimeter+1))); 
    } 
    if(indexOfDelimeter<originalString.length()) 
    { 
     result.append(upperCase(newBaseString,delimeter)); 
    } 
    return result.toString(); 
} 
} 
Verwandte Themen