2010-02-12 13 views
6

Ich habe etwas Code, den ich von Perl zu Java konvertieren. Es macht ziemlich viel Gebrauch von regulären Ausdrücken, einschließlich des Operators s///. Ich benutze Perl schon lange und gewöhne mich immer noch an Java. Insbesondere scheinen Strings schwieriger zu arbeiten. Kennt jemand eine Java-Funktion oder hat diese eine Java-Funktion, die s/// vollständig implementiert? So, dass es so etwas wie dies zum Beispiel umgehen kann: (. Vielleicht nicht ein großartiges Beispiel, aber Sie bekommen die Idee)Java-Äquivalent von Perls /// Operator?

$newString =~ s/(\bi'?\b)/\U$1/g; 

Dank.

+3

Werfen Sie einen Blick auf die Jakarta ORO Regexp-Bibliothek, für \ U Unterstützung siehe http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/Perl5Substitution.html Klasse – rsp

+0

Sieht sehr aus nützlich, danke! – reid

+0

Nachdem wir uns ein wenig umgeschaut haben, ist ORO in der Tat sehr nützlich. S /// und einen eingebauten \ U-Operator zu haben ist großartig. Bisher empfehle ich es! – reid

Antwort

1

Schauen Sie sich die replaceAll(...) Methode von String an. Beachten Sie, dass Java die Funktion \U (Großschreibung) nicht unterstützt.

+0

Danke. Ich habe auch Matcher.replaceAll() gefunden. Sind sie mächtig genug, um mit meinem Beispiel umzugehen, aber ...? – reid

+0

'Matcher.replaceAll()' wird von 'replaceAll()' '' 'verwendet. Das beantwortet also deine andere Frage: Nein, '\ U' wird nicht unterstützt. –

+0

Ich habe den \ U Teil Ihrer Antwort verpasst. Ich denke, ich muss akzeptieren, dass replaceAll() für die meisten, aber nicht alle Fälle funktioniert. – reid

6

Nichts ist so ordentlich, aber in Java würden Sie String.replaceAll() oder Pattern wie etwas zu tun, verwenden verwenden:

Pattern p = Pattern.compile("(\bi'?\b)"); 

Matcher m = p.matcher(stringToReplace); 
m.replaceAll("$1"); 

Überprüfen Sie die Pattern-Dokumentation für Java regex Syntax - es ist nicht vollständig mit Perl überlappt.


Um großgeschrieben Besuche Matcher.appendReplacement:

StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    String uppercaseGroup = m.group(1).toUpperCase(); 
    m.appendReplacement(sb, uppercaseGroup); 
} 
m.appendTail(); 

nicht so nah an Perl als jakarta-oro Bibliothek oben Bezug genommen wurde, aber auf jeden Fall etwas Hilfe in die Bibliothek gebaut.

2

eine Instanz einer Klasse String Gegeben Sie die .ReplaceAll() -Methode wie so verwenden können:

String A = "Test"; 
A.replaceAll("(\bi'?\b)","\U$1"); 

Bearbeiten - ok zu langsam. Auch anscheinend wird \ U laut einer anderen Antwort nicht unterstützt.

Hinweis - Ich bin mir nicht sicher, wie sich das gierige Symbol übersetzen lässt. Vielleicht möchten Sie die Implementierung von Java ausprobieren, wenn Sie dies speziell benötigen.

+0

Das '\ U' in Ihrer Ersetzungszeichenfolge verursacht das Auslösen einer RuntimeException. –

+1

Danke. Ich bin ziemlich beeindruckt davon, wie sehr die Regexp-Syntax identisch ist, abgesehen von einem zusätzlichen Backslashing in Java. (Schade um \ U, though.) Ich wünschte, Java-String-Handhabung war mehr wie Perl's .... – reid

+1

Wie es zur String-Manipulation kommt, ist Perl König. Aber ja, die Regex-Implementierung von Java ist solide und mächtig, wenn auch manchmal mit allen Backslashes und der Objekterstellung. –

Verwandte Themen