2012-05-08 9 views
6

Mam działające wyrażenie regularne w Pythonie i próbuję przekonwertować na Javę. Wydaje się, że istnieją subtelne różnice w implementacjach.Różnice w składni RegEx między Pythonem i Javą

RegEx próbuje dopasować inny reg ex. Regex w pytaniu:

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B) 

Jeden z ciągów, że ma problemy na to: /\s+/;

reg ex nie ma być dopasowane końcowy ;. W Pythonie regex działa poprawnie (i nie odpowiada końcowy ;, ale w Javie robi zawierać ;

zapytania (y).

  1. Co mogę zrobić, aby uzyskać ten RegEx działa w Java?
  2. na podstawie tego co czytałem here nie powinno być żadnej różnicy w tym regEx. Czy jest gdzieś wykaz różnic pomiędzy implementacjami regex w Pythonie vs Java?
+4

mógłbyś pisać kod Python i Java do meczu? Czy możesz wyjaśnić, co masz na myśli przez "To dzieje się w Pythonie, ale nie w Javie"? Który język pasuje do napisu, a który nie? – happydave

+0

Wygląda na to, że regex pasuje do literału regex JavaScript, prawda? I działa w Pythonie, ale chcesz go uruchomić w Javie? –

+0

@happydave - wyjaśniono powyższe pytanie. – Vineet

Odpowiedz

10

Java nie analizować wyrażeń regularnych w taki sam sposób jak Python dla małego zbioru przypadków. W tym szczególnym przypadku zagnieżdżone [ były przyczyną problemów. W Pythonie nie ma potrzeby ucieczki od żadnego zagnieżdżonego [, ale musisz to zrobić w Javie.

Oryginalny RegEx (dla Pythona):

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B) 

Stała RegEx (Java i Python):

/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/([gim]+\b|\B) 
5

oczywistym d ifference b/w Java i Python jest to, że w Javie trzeba uciec wielu znaków.

Ponadto, prawdopodobnie uruchomiony w niedopasowania metod dopasowania, a nie różnicy w rzeczywistej notacji regex:

Given Java

String regex, input; // initialized to something 
Matcher matcher = Pattern.compile(regex).matcher(input); 
  • Java matcher.matches() (również Pattern.matches(regex, input)) odpowiada cały ciąg. Nie ma bezpośredniego odpowiednika w Pythonie. Ten sam wynik można osiągnąć, używając re.match(regex, input) z regex, który kończy się $.
  • Java i Python matcher.find() za re.search(regex, input) mecz jakakolwiek część łańcucha.
  • Jawa matcher.lookingAt() i re.match(regex, input) Pythona pasują do początku napisu.

Aby uzyskać więcej informacji, zapoznaj się także z dokumentacją Java o numerze Matcher i porównaj ją z Python documentation.

Skoro powiedział, że nie jest problemem, postanowiłem zrobić test: http://ideone.com/6w61T Wygląda java robi dokładnie to, czego potrzebują do (grupy 0, cały mecz, nie zawierają ;) . Twój problem jest gdzie indziej.

+0

Tak, znaki są ukrywane. Świetny punkt o różnicach w metodach - to nie wydaje się być tutaj problemem (zweryfikowałem - wydaje się, że coś jest nie tak z regem). Zagłębiając się w to trochę bardziej na (http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html) wydaje się, że tam * jest * odpowiednik dla 'revatch Pythona 'w Javie - wydaje się być' matcher.lookingAt'. – Vineet

+0

@Vetet Zauważono i edytowano. Przetestowałem to także i twój problem wydaje się być gdzie indziej. – trutheality