/ / Incompatibilidad al portar la lógica de PHP preg_match a Java usando String.matches - java, php, regex

Incompatibilidad al portar la lógica de PHP preg_match a Java usando String.matches - java, php, regex

encontré esta pregunta sobre cómo portar PHP "s preg_match a Java (recomienda usar String.matches(). Sin embargo, todavía tengo problemas con la siguiente situación:

PHP:

preg_match("/<(h1|h2|h3|h4|ul|td|div|table)/i", "<h1>") => devuelve 1

Java:

"<h1>".matches("/<(h1|h2|h3|h4|ul|td|div|table)/i") => volver false

¿Por qué sería eso?

Respuestas

1 para la respuesta № 1

En java matches() requiere una coincidencia de cadena completa. Y no necesitas delimitadores de expresiones regulares.

"<h1>".matches("(?i)<(h1|h2|h3|h4|ul|td|div|table)>")

Ver Demo IDEONE

Si planea usar la misma expresión regular en Java, use Matcher con find() (find coincidirá en cualquier lugar en la cadena de entrada y Pattern.CASE_INSENSITIVE actuará como i opción en PHP):

String str = "<h1>";
String rx = "<(h1|h2|h3|h4|ul|td|div|table)";
Pattern ptrn = Pattern.compile(rx, Pattern.CASE_INSENSITIVE);
Matcher m = ptrn.matcher(str);
while (m.find()) {
System.out.println(m.group(0));
}

Ver otra demo


1 para la respuesta № 2
  • Es necesario eliminar los delimitadores de expresiones regulares.

  • Y también hay que añadir (?i) Modificador para hacer coincidencias insensibles a mayúsculas.

  • Finalmente tienes tyo add > en el último desde matches El método intenta hacer coincidir toda la cadena.

    "<h1>".matches("(?i)<(h1|h2|h3|h4|ul|td|div|table)>");
    

0 para la respuesta № 3

En Java debería ser:

"<h1>".matches("(?i)<(h[1234]|ul|td|div|table)>");

es decir, sin delimitador de expresiones regulares y (?i) para la comparación de casos ignorados.