/ / Niekompatybilność podczas przenoszenia logiki PHP preg_match na Javę za pomocą String.matches - java, php, regex

Niekompatybilność podczas przenoszenia logiki PHP preg_match na język Java za pomocą String.matches - java, php, regex

znalazłem to pytanie o tym, jak portować PHP preg_match do Java (zaleca użycie String.matches(). Jednak nadal mam problem z następującą sytuacją:

PHP:

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

Jawa:

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

Dlaczego miałoby to być?

Odpowiedzi:

1 dla odpowiedzi № 1

W języku Java, matches() wymaga pełnego dopasowania łańcuchowego. I nie potrzebujesz ograniczników regex.

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

Widzieć IDEONE demo

Jeśli zamierzasz używać tego samego wyrażenia regularnego w Javie, użyj Matcher z find() (find dopasuje się do dowolnego ciągu wejściowego i Pattern.CASE_INSENSITIVE będzie działać jako i opcja w 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));
}

Widzieć kolejne demo


1 dla odpowiedzi nr 2
  • Musisz usunąć ograniczniki regex.

  • A także musisz dodać (?i) modyfikator do porównywania wielkości liter.

  • Nareszcie masz tyo add > na końcu od matches metoda próbuje dopasować cały ciąg.

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

0 dla odpowiedzi № 3

W Javie powinno być:

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

tj. nie ma ogranicznika regex i (?i) do porównywania przypadków ignorowanych.