2010-02-12 15 views
6

Ho un codice che sto convertendo da Perl a Java. Fa un uso piuttosto pesante delle espressioni regolari, incluso l'operatore s///. Sto usando Perl da molto tempo e mi sto ancora abituando al modo di fare Java. In particolare, sembra che le stringhe siano più difficili da utilizzare. Qualcuno sa o ha una funzione Java che implementa completamente s///? In modo da poter gestire qualcosa di simile, per esempio: (. Forse non è un grande esempio, ma si ottiene l'idea)Equivalente Java dell'operatore /// di Perl?

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

Grazie.

+3

Dai un'occhiata alla biblioteca regexp Jakarta ORO, per il supporto \ U vedere la classe http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/Perl5Substitution.html – rsp

+0

sembra molto utile, grazie! – reid

+0

Dopo averlo esaminato un po ', ORO è davvero molto utile. Avere s /// e un operatore \ U integrato è fantastico. Finora lo raccomando! – reid

risposta

1

Dai un'occhiata al metodo replaceAll(...) di String. Si noti che Java non supporta la funzione \U (maiuscolo).

+0

Grazie. Ho anche trovato Matcher.replaceAll(). Sono abbastanza potenti da gestire il mio esempio di upcasing della partita, anche se ...? – reid

+0

'Matcher.replaceAll()' è usato da 'String''s' replaceAll() '. In modo che risponda alla tua altra domanda: no, '\ U' non è supportato. –

+0

Ho perso la parte \ U della tua risposta. Immagino di dover accettare che replaceAll() funzionerà per la maggior parte ma non tutti i casi. – reid

6

Niente di così ordinata, ma in Java si usa String.replaceAll() o utilizzare Pattern fare qualcosa di simile:

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

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

Controllare la documentazione del modello per la sintassi regex Java - non si sovrapponga completamente con il Perl.


Per ottenere maiuscolo, prova anche Matcher.appendReplacement:

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

Non così vicino a Perl come la libreria jakarta-oro di cui sopra, ma sicuramente un po 'di aiuto integrato nella libreria.

2

Dato un'istanza di una classe String è possibile utilizzare il metodo .ReplaceAll() in questo modo:

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

Edit - ok troppo lento. Anche apparentemente \ U non è supportato secondo un'altra risposta.

Nota: non sono sicuro di come si traduca il simbolo goloso, è consigliabile provare a esaminare l'implementazione di Java se necessario.

+0

Il '\ U' nella stringa di sostituzione causerà il lancio di una RuntimeException. –

+1

Grazie. Sono rimasto molto colpito da quanto la sintassi regexp sia identica, a parte il backslashing extra in Java. (Peccato per \ U, però.) Vorrei che la gestione delle stringhe di Java fosse più simile a quella di Perl .... – reid

+1

Per quanto riguarda la manipolazione delle stringhe, Perl è il re. Ma sì, l'esecuzione delle regex di Java è solida e potente, anche se a volte è prolissa con tutte le barre retroverse e la creazione dell'oggetto. –