2011-02-24 8 views
5

que tenga que sustituir todos los "símbolos" & con "&#38" en mi archivo de texto pero no los códigos html o como &"Java/de análisis: cómo sustituir los códigos y símbolos, pero no html

estoy Actualmente utilizando row = row.replace("& ", "&#38");

pero, como he dicho también se reemplazan los códigos html por ejemplo " y no quiero esto .. gracias

ps. No puedo añadir espacios después & porque necesito reemplazarlo con palabras tales como M&M o Ella & David

+0

También necesita un punto y coma. '&' o '&', no solo '& # 38'. –

+0

Posible duplicado de: http://stackoverflow.com/questions/240546/removing-html-from-a-java-string –

Respuesta

4

Usted podría tratar de una expresión regular, por ejemplo,

row = row.replaceAll("&(?![#a-zA-Z0-9]+;)", "&"); 

La expresión regular reemplazar & dado que es no seguido de a sequence of '#a-zA-Z0-9' ending with ';'

+0

lo siento, hubo un error en mi pregunta. Los códigos html no tienen # después de &, pero tienen pocas letras (longitud diferente) que terminan en a; – aneuryzm

+0

De acuerdo, he actualizado la expresión regular a la pregunta. –

+0

Su expresión regular no funciona para la forma 'ō' de cadenas. Lo que probablemente necesite es 'row.replaceAll (" & (?! [# A-zA-Z0-9] +;) "," & ");' – adarshr

0

El patrón "& " debería ser , ya que el espacio en blanco también tiene un identificador de patrón.

Así que la línea debe decir row = row.replace("&\\s", "&#38");

+0

excepto que acabo de notar su postscript, por lo que esto no captaría el '&' en 'M & M' – MattLBeck

0

Trate

String replacedAmpersands = row.replaceAll("&(?!(?:#\\d+|\\p{L}+);)", "&") 

Esto sólo se reemplazarán los símbolos de unión que no son seguidos por #\d+; (hachís, números, punto y coma) o \p{L}+; (letras, punto y coma).

1

No hay solución general, ya que en su texto puede haber cosas como

& 

que puede consistir en uno o signo, o sea una forma malformación de decir & que debe ser expresado como

& 

Sin embargo, este último es bastante improbable (a menos que esté escapando algo de HTML).

Así que trate de algo así como

row = row.replaceAll("&(?!(?:\\#|amp|quot|nbsp|\\d+);)", "&"); 

BTW., &#38 le falta el punto y coma final. Prefiera & para usar códigos ASCII.

0

Esta solución es más complicada pero tengo la sensación de que es a prueba de todo, mientras que las soluciones de expresiones regulares pueden no ser 100% correctas (según el famoso "do not use regex for HTML stackoverflow thread").

Usando Jsoup:

public static String html2text(String html) { 
    return Jsoup.parse(html).text(); 
} 

Esto le dará un texto para asegurarse de que sólo contiene los símbolos de unión que necesita, no el resto.

A continuación, crear un mapa que contiene en el lado izquierdo de las frases como M&M y Ella & David y luego en el lado derecho de las frases M&M y Ella & David

El paso final es volver al texto HTML inicial y la sustitución las cadenas en el LHS del mapa con las del RHS.

Editar: por supuesto, puede usar cualquier analizador HTML que desee, solo quería darle un ejemplo rápido de lo fácil que es usar uno.

Cuestiones relacionadas