2010-07-22 12 views
5
<?php 
    $str = "word <a href=\"word\">word</word>word word"; 
    $str = preg_replace("/word(?!([^<]+)?>)/i","repl",$str); 
    echo $str; 
    # repl <word word="word">repl</word> 
?> 

fonte: http://pureform.wordpress.com/2008/01/04/matching-a-word-characters-outside-of-html-tags/Qual è l'equivalente Java di questo preg_replace?

Unfortunality il mio progetto ha bisogno di un librerie semantiche avaliable solo per Java ...

// Grazie Celso

+1

È seriamente necessario riformulare questa domanda. 1) che cosa ha a che fare con java? 2) quali sono i tuoi input e output attesi? – whaley

+0

risultato atteso: REPL repl repl repl – celsowm

risposta

8

String.replaceAll():

class Test { 
    public static void main(String[] args) { 
    String str = "word <a href=\"word\">word</word>word word"; 
    str = str.replaceAll("word(?!([^<]+)?>)", "repl"); 
    System.out.println(str); 
    } 
} 

Spero che questo aiuti.

+1

Grazie !!! e versione perfetta con caso insensibile: "(? i) parola (?! ([^ <]+)?>)"; – celsowm

1

Prima di fornire un ulteriore risposta, stai cercando di analizzare un documento html? In tal caso, non utilizzare espressioni regolari, utilizzare un parser html. Utilizzare il metodo

+0

il mio strumento "genera" XHTML sostituzione di termini in un txt in un nuovo tag che utilizzano i termini come un valore all'interno di tag, io sto usando il replaceAll approccio perché alcuni termini possono essere composti come "Celso Araujo Fontes". Esempio, come replaceAll myTerm in questa situazione myTerm è cool amico – celsowm

2

Per tradurlo regex per l'uso in Java, tutto quello che dovete fare è sbarazzarsi del / delimitatori e cambiare il finale i ad un modificatore di linea, (?i). Ma non è una regex molto buona; Vorrei usare questo, invece:

(?i)word(?![^<>]++>) 

Secondo la funzione di debug di RegexBuddy, quando si cerca di far corrispondere il word nel <a href="word">, regex originale richiede 23 passaggi di rigetto, mentre questo prende solo sette passaggi. Il codice Java effettivo è

str = str.replaceAll("(?i)word(?![^<>]++>)", "repl"); 
+0

Grazie Alan per la spiegazione! – celsowm