jdk features java regex string rawstring

features - Raw Strings en Java-para expresiones regulares en particular



java 12 features (11)

¿Hay alguna forma de usar cadenas sin formato en Java (sin secuencias de escape)?

(Estoy escribiendo una buena cantidad de código regex y cadenas sin formato harían que mi código sea mucho más legible)

Entiendo que el lenguaje no proporciona esto directamente, pero ¿hay alguna forma de "simular" de alguna manera?


(Los archivos de propiedades son comunes, pero desordenados: trato la mayoría de los regex como código y los mantengo donde puedo referirme, y tú también deberías. En cuanto a la pregunta real:)

Sí, hay formas de evitar la mala legibilidad. Puede intentar:

String s = "crazy escaped garbage"; //readable version//

aunque esto requiere cuidado al actualizar. Eclipse tiene una opción que le permite pegar texto entre comillas, y las secuencias de escape se aplican para usted. La táctica sería editar primero las versiones legibles y luego eliminar la basura y pegarlas entre las comillas vacías "".

Tiempo de idea:

Hackear tu editor para convertirlos; liberar como un complemento. Revisé los plugins, pero no encontré ninguno (intente buscar). Existe una correspondencia uno a uno entre las cadenas de origen escapadas y el texto de la caja de texto (con descuento / n, / r / n). Tal vez el texto resaltado con dos comillas en los extremos podría ser utilizado.

String s = "########## #####";

donde # es cualquier carácter, que se resalta: el salto se trata como una nueva línea. El texto escrito o pegado dentro del área resaltada se escapa en la fuente ''real'' y se muestra como si no lo fuera. (De la misma manera que Eclipse escapa el texto pegado, esto escaparía al texto escrito, y también lo mostraría sin las barras diagonales inversas). Borre una de las comillas para causar un error de sintaxis si desea editar normalmente. Hmm.


Esto es una solución si estás usando eclipse. Puede hacer que los bloques de texto largos se multipliquen correctamente de forma automática y que los caracteres especiales se escapen automáticamente al pegar texto en un literal de cadena

"-paste aquí-";

si habilita esa opción en ventana → preferencias → java → Editor → Escribir → "Texto de escape al pegar en un literal de cadena"


No (bastante triste)


No, no hay.

En general, pondría cadenas y expresiones regulares sin formato en un archivo de propiedades, pero también tienen requisitos de secuencia de escape.


No. Pero hay un complemento IntelliJ que lo hace más fácil de manejar, llamado manipulación de cadenas .

IntelliJ también escapará automáticamente de una cadena pegada en él. (Como @Dread señala , Eclipse tiene un complemento para habilitar esto).


Personalmente, considero datos de cadenas regex y no de código, por lo que no me gustan en mi código, pero me doy cuenta de que no es práctico ni impopular (sí, me doy cuenta, no tienes que gritarme).

Dado que no existe una forma nativa de hacer esto, puedo proponer dos posibilidades (bueno, tres, pero la tercera es, umm, antinatural).

Así que mi preferencia personal sería simplemente analizar un archivo en cadenas. Puede nombrar cada entrada en el archivo y cargarlas todas en una tabla hash para acceder fácilmente desde su código.

Segunda opción, cree un archivo que será preprocesado en una interfaz java; podría escapar de la expresión regular como lo hace. Personalmente odio la generación de código, pero si el archivo java es 100% editado nunca por humanos, no es tan malo (¡el verdadero mal son los archivos generados que se espera que edites!)

Tercero (engañosa y probablemente una mala idea): es posible que pueda crear un doclet personalizado que extraiga cadenas de sus comentarios en un archivo de texto o un archivo de encabezado en tiempo de compilación, luego use uno de los otros dos métodos anteriores. Esto mantiene sus cadenas en el mismo archivo en el que se están utilizando. Esto podría ser realmente difícil de hacer correctamente, y las penalidades por fallas son extremas, así que ni siquiera lo consideraría a menos que tuviera una necesidad abrumadora y un talento bastante impresionante.

Solo sugiero esto porque los comentarios son de forma libre y las cosas dentro de una etiqueta "pre" son bastante seguras para los formateadores y otros problemas del sistema. El doclet podría extraer esto antes de imprimir los javadocs, e incluso podría agregar algunos de los javadocs generados que indican el uso de cadenas de expresiones regulares.

Antes de declinar y decirme que es una idea estúpida, lo sé, pensé que lo recomendaría porque es interesante, pero mi preferencia, como dije antes, es un simple archivo de texto ...


Puede escribir su propio lector de propiedades no escapado y poner sus cadenas en un archivo de recursos.


Tenga el archivo de texto sin procesar en su ruta de clase y léelo con getResourceAsStream (....)


Yo uso Pattern.quote . Y resuelve el problema de la pregunta. Así que:

Pattern pattern = Pattern.compile(Pattern.quote("/r/n?|/n"));

El método de cotización devuelve una cadena que coincidiría con el argumento de cadena proporcionado, que la cadena de retorno es la cadena que se cita correctamente para nuestro caso.


String#getBytes() expone una copia de la matriz de bytes interna contenida en cada objeto String que en realidad contiene la cadena codificada en UTF-16 de 16 bits: la matriz de bytes contendrá la misma cadena convertida para coincidir con el juego de caracteres predeterminado de la plataforma. Lo que estoy diciendo es que creo que esto es lo más cercano a la cadena "en bruto" que se puede obtener en Java.


Nota: a partir de hoy, no disponible. Probablemente edite esta respuesta nuevamente cada vez que se publique la función.

Existe una propuesta en curso para introducir Raw Strings en Java . En realidad, son muy útiles en los casos de expresiones regulares.

Ejemplo 1: una cadena de expresión regular que fue codificada como

System.out.println("this".matches("//w//w//w//w"));

puede ser codificado alternativamente como

System.out.println("this".matches(`/w/w/w/w`));

ya que las barras diagonales inversas no se interpretan como que tienen un significado especial.

Ejemplo 2: se agrega un literal de cadena de varias líneas con idioma extranjero.

A multiple line string that was coded as String html = "<html>/n" + " <body>/n" + " <p>Hello World.</p>/n" + " </body>/n" + "</html>/n";

puede ser codificado alternativamente como

String html = `<html> <body> <p>Hello World.</p> </body> </html> `;

lo que evita la necesidad de comillas intermedias, concatenaciones y nuevas líneas explícitas.

Esperemos que podamos esperar el lanzamiento pronto.