2010-07-22 21 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> 
?> 

fuente: http://pureform.wordpress.com/2008/01/04/matching-a-word-characters-outside-of-html-tags/¿Cuál es el equivalente de Java a este preg_replace?

Unfortunality mi proyecto necesita un libs semánticas avaliable sólo para Java ...

// Gracias Celso

+1

Es muy importante que vuelva a formular esta pregunta. 1) ¿qué tiene esto que ver con java? 2) ¿cuál es tu entrada y salida esperada? – whaley

+0

resultado esperado: repl repl repl repl – celsowm

Respuesta

8

Utilice el método 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); 
    } 
} 

Espero que esto ayude.

+1

Gracias !!! y la versión perfecta con caso insensible: "(? i) word (?! ([^ <]+)?>)"; – celsowm

1

Antes de dar una respuesta aún más, estás tratando de analizar un ¿documento html? Si es así, no use expresiones regulares, use un analizador html.

+0

mi herramienta "genera" XHTML reemplazando términos en un txt en etiquetas nuevas utilizando los términos como un valor dentro de la etiqueta, estoy usando el replaceAll enfoque porque algunos términos se pueden componer como "Celso Araujo Fontes". Ejemplo, cómo replaceAll myTerm en esta situación myTerm es amigo genial – celsowm

2

Para traducir esa expresión regular para su uso en Java, todo lo que tiene que hacer es deshacerse de los delimitadores / y cambiar el i posterior a un modificador en línea, (?i). Pero no es una expresión regular muy buena; Me gustaría utilizar esto en su lugar:

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

según la característica de depuración de RegexBuddy, cuando se intenta hacer coincidir el word en <a href="word">, la expresión regular original requiere 23 pasos para rechazarla, mientras este se lleva sólo siete pasos. El código real de Java es

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

¡Gracias Alan por la explicación! – celsowm

Cuestiones relacionadas