2010-02-12 14 views
6

Mam kod, który konwertuję z Perl na Javę. Stosuje dość intensywne użycie wyrażeń regularnych, w tym operatora s///. Używam Perla przez długi czas i wciąż przyzwyczaję się do sposobu działania Java. W szczególności ciągi wydają się trudniejsze do pracy. Czy ktoś zna lub ma funkcję Java, która pełni implementuje s///? Aby obsłużyć coś takiego, na przykład:Odpowiednik Java operatora Perla ///?

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

(Może nie świetny przykład, ale masz pomysł.) Dzięki.

+3

Spójrz na bibliotekę regexp Oarta Jakarta, aby uzyskać wsparcie dla \ U, patrz http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/Perl5Substitution.html klasa – rsp

+0

Wygląda bardzo przydatne, dzięki! – reid

+0

Po troszczeniu się o to, ORO jest rzeczywiście bardzo przydatne. Posiadanie s /// i wbudowanego operatora \ U jest świetne. Do tej pory polecam! – reid

Odpowiedz

1

Zobacz metodę String's replaceAll(...). Zwróć uwagę, że Java nie obsługuje funkcji dużego formatu (\U).

+0

Dzięki. Znalazłem także Matcher.replaceAll(). Czy są na tyle potężni, aby poradzić sobie z moim przykładem podbicia meczu, chociaż ...? – reid

+0

'Matcher.replaceAll()' jest używane przez 'String'' 'replaceAll()'. To odpowiada na twoje drugie pytanie: nie, '\ U' nie jest obsługiwane. –

+0

Brakowało mi \ u części odpowiedzi. Chyba muszę zaakceptować, że replaceAll() będzie działać dla większości, ale nie wszystkich przypadków. – reid

6

Nic tak uporządkowane, ale w Javie byłoby użyć String.replaceAll() lub użyj Pattern zrobić coś takiego:

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

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

Sprawdź docs wzorzec dla składni regex Java - nie pokrywają się całkowicie z Perl.


Aby uzyskać uppercasing, sprawdź Matcher.appendReplacement:

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

Nie tak blisko jak Perl biblioteki Dżakarta oro mowa powyżej, ale na pewno trochę pomocy wbudowanego w bibliotece.

2

Biorąc instancję klasy String można wykorzystać metodę .replaceAll() tak:

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

Edit - ok zbyt powolne. Najwyraźniej \ U nie jest obsługiwane zgodnie z inną odpowiedzią.

Uwaga - nie jestem pewien, jak zachowuje się chciwy symbol, możesz spróbować zajrzeć do implementacji Javy, jeśli potrzebujesz tego specjalnie.

+0

'\ U' w ciągu zastępującym spowoduje wygenerowanie wyjątku RuntimeException. –

+1

Dzięki. Byłem pod wrażeniem tego, jak bardzo składnia regexp jest identyczna, oprócz dodatkowego backslash w Javie. (Szkoda jednak \ U, jednak.) Życzę sobie, aby obsługa ciągów Java była bardziej podobna do Perla ... – reid

+1

Jeśli chodzi o manipulowanie strunami, Perl jest królem. Ale tak, implementacja regex Java jest solidna i potężna, aczkolwiek pełna gadek i odwrotnych ukształtowań obiektów. –

Powiązane problemy