2012-01-06 16 views
12

Jestem świadomy, że regEx są wspólne w różnych językach ... Ale mam problemy z pisaniem składni Java. Mam wyrażenie regularne zakodowane w JS jako;Konwersja wyrażenia regularnego JavaScript na składnię Javy

if((/[a-zA-Z]/).test(str) && (/[0-9]|[\x21-\x2F|\x3A-\x40|\x5B-\x60|\x7B-\x7E]/).test(str))   
return true; 

Jak napisać to samo w Javie?

mam importowane

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

Wystarczy dodać, ze to, co próbuję to mówi \ X jest nieprawidłowy znak ucieczki ..

Odpowiedz

27

Zmiana początkowe i końcowe '/' znaki '"' i następnie wymień każdy '\' na "\\".

W przeciwieństwie do JavaScript, Perl i innych języków skryptowych Java nie ma specjalnej składni dla wyrażeń regularnych. Zamiast tego są (zazwyczaj) wyrażane za pomocą literałów napisanych w języku Java. Ale '\' jest znakiem ucieczki w literałowym ciągu Java, więc każdy '\' w oryginalnym regex musi zostać zmieniony przy pomocy drugiego '\'. (Jeśli masz dosłowny znak odwrotnego ukośnika w regex, kończysz z "\\\\" w ciągu literowym języka Java !!)

To jest trochę mylące/zniechęcające dla nowicjuszy Java ... ale jest całkowicie logiczne. Pamiętaj tylko, że do wyrażenia wyrażenia regularnego używasz literału napisanego w języku Java.


Jednak jak zauważa @antak, istnieje wiele różnic między językami regex w Java i JavaScript. Jeśli więc weźmiesz regex JavaScript i przetłumaczysz go na Javę jak wyżej, może to nie działać.

Oto kilka odniesień podsumowujących różnice.

+0

Thx dużo..Nie do końca dostałem drugą część ... Zamień każdy "\" na "\" ..... Czy oba nie są takie same? – testndtv

+0

@testndtv - Powiedziałem "musi być ** uciekł ** z drugim odwrotnym ukośnikiem". Nie powiedziałem, że trzeba go wymienić. –

+0

Szkoda, że ​​nie było sposobu, aby dodać do zakładek odpowiedzi ... czekaj, nieważne. Zakładki. W każdym razie, dzięki. – hypd09

3

Jedyną rzeczą, którą musisz zrobić, to duplikat powrotem ukośniki.

Pattern p1 = Pattern.compile("[a-zA-Z]"); 
Pattern p2 = Pattern.compile("[0-9]|[\\x21-\\x2F|\\x3A-\\x40|\\x5B-\\x60|\\x7B-\\x7E]"); 

if (p1.matcher(str).find() && p2.matcher(str).find()) { 
    return true; 
} 
+0

Thx wiele ... Otrzymuję błąd składni dla linii ... jeśli nie ... – testndtv

+1

@testndtv: Nigdy nie mów, że pojawia się błąd bez pokazywania błędu wiadomość. –

+0

Brakowało drugiego wywołania 'find()'; Spróbuj teraz. –

0

wyrażenia regularne Java są przede wszystkim sznurki, więc trzeba zacząć cudzysłowach i nie /. Ponadto, w java, musisz uciec \, wykonując dwa z nich tak, jak \\. Aby uzyskać więcej informacji, należy zapoznać się z samouczkiem this firmy Oracle.

+1

To nie jest sam silnik regex, to metoda 'matches()', która wymaga użycia regex cały ciąg, jakby był zakotwiczony na obu końcach. Metoda 'find()' wykonuje bardziej tradycyjny rodzaj dopasowania, ale nie możesz wywoływać go z obiektu String tak jak z 'match()'; musisz jawnie utworzyć obiekt Matchera, taki jak [AlexR zrobił] (http://stackoverflow.com/a/8754491/20938). –

+0

@AlanMoore: Dzięki, że mnie powiadomiłeś. Rzadko używałem find, prawie zawsze używałem 'matches()'. Usunąłem tę sekcję z mojej odpowiedzi, jeszcze raz dziękuję za wyjaśnienia. – npinti

1

Myślę, że może być to pomocne. W Javie mamy klasy do uruchamiania javascript z java. wszelkie myśli są mile widziane.

javax.script.ScriptEngineManager se = new javax.script.ScriptEngineManager(); 
     javax.script.ScriptEngine engine = se.getEngineByName("js"); 

String regExp = "/^\\d+$/";<br> 
engine.put("str", "1234");<br> 
engine.eval("var rgx="+regExp);<br> 
Object value = engine.eval("function validate(r, s){ return (r).test(s);};validate(rgx, str);");<br> 
logger.log(value); 
Powiązane problemy