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 № 1W 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 odmatches
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.