Powered by skn.net  


  Reply to this topicStart new topicStart Poll

> Java Regex - BUG?
Waldemar
'Haudegen'
Geschrieben: 08.02.2010 - 15:37
Quote Post



****
Beiträge: 522
Mitglied seit: 22.09.2003
Benutzergruppe:
Informatik (Master)

Absolvent
Keinen



Hallo! Könnte jemand erklären, warum ich "false" in der Console bekomme? Der reguläre Ausdruck ist doch richtig. Oder täusche ich mich?

CODE
package test;

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

public class Quatsch
{

public static void main(String[] args)
{
 Pattern p = Pattern.compile("((b)?cc|x)");
 Matcher m = p.matcher("x");
 System.out.println(m.find()); // --> false
}
}
PMEmail Poster
Top
Oliver Steenbuck
'for Pony'
Geschrieben: 08.02.2010 - 15:45
Quote Post



****
Beiträge: 387
Mitglied seit: 05.02.2008
Benutzergruppe:
Administratoren

5. Semester
Informatik (Bachelor)



Versuch mal
CODE
Pattern p = Pattern.compile("(((b)?cc)|(x))");


Ich bin spontan immer nicht so ganz mit der Bindungsreihenfolge Vertraut.

Grüße
Oli
PMEmail PosterIntegrity Messenger IMICQ
Top
Waldemar
'Haudegen'
Geschrieben: 08.02.2010 - 15:51
Quote Post



****
Beiträge: 522
Mitglied seit: 22.09.2003
Benutzergruppe:
Informatik (Master)

Absolvent
Keinen



CODE
Pattern p = Pattern.compile("(((b)?cc)|(x))");

Danke für die Antwort. :) Deiner Code funktioniert, aber der Ausdruck von mir muss doch auch funktionieren. Bis jetzt habe ich keinen Fehler gefunden. Langsam werde ich skeptisch, was die java regexp angeht


Der Beitrag wurde bearbeitet von Waldemar am 08.02.2010 - 15:51
PMEmail Poster
Top
Waldemar
'Haudegen'
Geschrieben: 08.02.2010 - 15:56
Quote Post



****
Beiträge: 522
Mitglied seit: 22.09.2003
Benutzergruppe:
Informatik (Master)

Absolvent
Keinen



Ich habe hier rumprobiert:

Die Pattern a und c funktionieren, der c fällt durch, wobei b von c nur ein "c" unterscheidet


CODE
package javaregex;

import static org.junit.Assert.assertTrue;

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

import org.junit.Test;

public class RegexTest {
   Pattern a = Pattern.compile("(a|(b)?cc|x)");

   /***********************************************
    * Pattern b fails to match the String "x"
    */
   Pattern b = Pattern.compile("((b)?cc|x)");

   Pattern c = Pattern.compile("((b)?c|x)");

   String s = "x";

   @Test
   public void testPatternA() throws Exception {
Matcher match = a.matcher(s);
assertTrue(match.find());
   }

   @Test
   public void testPatternB() throws Exception {
Matcher match = b.matcher(s);
assertTrue(match.find());
   }

   @Test
   public void testPatternC() throws Exception {
Matcher match = c.matcher(s);
assertTrue(match.find());
   }
}
PMEmail Poster
Top
Stefan.M
'The saw is the law!'
Geschrieben: 09.02.2010 - 19:33
Quote Post



***
Beiträge: 60
Mitglied seit: 05.10.2007
Benutzergruppe:
Informatik (Bachelor)

3. Semester
Informatik (Bachelor)



QUOTE (Waldemar @ 08.02.2010 - 14:51)
Langsam werde ich skeptisch, was die java regexp angeht

Vermutung:
Pattern b: (b)?cc|x) wird interpretiert als (b)?c(c|x)
Pattern c: (b)?c|x) wird interpretiert als (b)?(c|x)

Deswegen geht das "x" bei c auch durch und bei b nicht.

Bei a keine Ahnung, ich würde an deiner Stelle mehr Klammern, dann klappt es auch! Ich bin mir sicher, dass die Java Regex "ordnungsgemäß" funktionieren :smoke:
PMEmail PosterUsers Website
Top
Waldemar
'Haudegen'
Geschrieben: 10.02.2010 - 10:00
Quote Post



****
Beiträge: 522
Mitglied seit: 22.09.2003
Benutzergruppe:
Informatik (Master)

Absolvent
Keinen



QUOTE (Stefan.M @ 09.02.2010 - 19:33)
Pattern b: (b)?cc|x) wird interpretiert als (b)?c(c|x)

Das wär dann nämlich falsche Interpretierung.

Der Beitrag wurde bearbeitet von Waldemar am 10.02.2010 - 10:00
PMEmail Poster
Top
Stefan.M
'The saw is the law!'
Geschrieben: 11.02.2010 - 17:05
Quote Post



***
Beiträge: 60
Mitglied seit: 05.10.2007
Benutzergruppe:
Informatik (Bachelor)

3. Semester
Informatik (Bachelor)



Meine Vermutung war falsch, hab nochmal getestet:
QUOTE
((b)?cc|x)


Das heißt entweder "(b)?cc" oder "x".
Bei (...|...) wird also scheinbar alles, was links oder rechts vom "|" steht, zusammengefasst. Entsprechend sollte eigentlich das "x" auch bei

QUOTE
((b)?c|x)


matchen (und ich verstehe auch nicht so ganz wieso es nicht so ist). Es hat auf jeden Fall was mit der Position des "?" zu tun, denn wenn man es in die Klammern hineinzieht, dann klappt es.

Also
QUOTE
((b?)cc|x)

wird für "x" zu true.

externer LinkOnline java regex tester

Was lernen wir daraus? Lieber ein paar Klammern mehr und man vermeidet solche Effekte!

:biggrin:

Der Beitrag wurde bearbeitet von Stefan.M am 11.02.2010 - 17:58
PMEmail PosterUsers Website
Top
Chris
'Foren As'
Geschrieben: 13.02.2010 - 02:17
Quote Post



***
Beiträge: 96
Mitglied seit: 14.11.2008
Benutzergruppe:
Informatik (Bachelor)

3. Semester
Informatik (Bachelor)



Der Fehler liegt nicht an der Expression, sondern daran das wir Matcher.find() irgendwie falsch benutzen:

CODE

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

public class Quatsch
{

public static void main(String[] args)
{
Pattern p = Pattern.compile("((b)?cc|x)");
Matcher m = p.matcher("xxx");
System.out.println(m.find());
System.out.println(m.find());
System.out.println(m.find());
System.out.println(m.find());
System.out.println(m.find());
}
}


CODE

true
true
false
false
false


Aus irgendeinem Grund wird der String.length()-1te Character (also der letzte) nicht/falsch beachtet. Bei einelementigen String knallts dann.

CODE

Pattern p = Pattern.compile("((b)?cc|x)");
Matcher m = p.matcher("x");
System.out.println(m.matches());


funktioniert genau wie gewünscht... *schulterzuck*


edith: (b?cc|x) als Pattern funktioniert für find() wie matches(), kann es sein das beim ursprünglichen Pattern find() ertmal (b) als Subpattern betrachtet?

Der Beitrag wurde bearbeitet von Chris am 13.02.2010 - 02:20
PMEmail PosterIntegrity Messenger IM
Top
[AI]Patrick
'der die Mantikoren verspeiste'
Geschrieben: 15.02.2010 - 01:52
Quote Post



****
Beiträge: 303
Mitglied seit: 03.03.2005
Benutzergruppe:
Informatik (Bachelor)

5. Semester
Informatik (Bachelor)



Huch, was macht ihr denn da Feines?

| ist greedy, glaub ich.
((b)?x|cc)

(IMG:externer Linkhttp://img121.imageshack.us/img121/3171/regexbla.png)
PMEmail Poster
Top
Chris
'Foren As'
Geschrieben: 15.02.2010 - 14:34
Quote Post



***
Beiträge: 96
Mitglied seit: 14.11.2008
Benutzergruppe:
Informatik (Bachelor)

3. Semester
Informatik (Bachelor)



QUOTE ([AI]Patrick @ 15.02.2010 - 02:52)
Huch, was macht ihr denn da Feines?
PMEmail PosterIntegrity Messenger IM
Top
[AI]Patrick
'der die Mantikoren verspeiste'
Geschrieben: 15.02.2010 - 19:41
Quote Post



****
Beiträge: 303
Mitglied seit: 03.03.2005
Benutzergruppe:
Informatik (Bachelor)

5. Semester
Informatik (Bachelor)



QUOTE (Chris @ 15.02.2010 - 03:34)
QUOTE ([AI)
Patrick,15.02.2010 - 02:52] Huch, was macht ihr denn da Feines?

new fags can't triforce
  ▲
▲  ▲

me win? (Verdammt, ich brauch Schlaf)
PMEmail Poster
Top
Bjoern_B
'Mitglied'
Geschrieben: 08.03.2010 - 14:12
Quote Post



**
Beiträge: 37
Mitglied seit: 14.09.2006
Benutzergruppe:
Technische Informatik

6. Semester
Technische Informatik (Bachelor)



Wahrsscheinlich ist dieser Thread schon verjährt. Aber ich gebe trotzdem mal meinen Senf dazu :clown:

Zuerstmal der Hinweis, dass es für Außenstehende interessant wäre zu wissen, was denn bspw. erfolgreich gematcht werden soll (verzeiht das Denglisch). Außerdem erschließt sich mir nicht, warum das 'b' und im laufe des Threads eigentlich ALLES gruppiert werden muss. Wie auch immer...

(b)?cc|x matcht u.a. "...bcc...", "...cc...", "...x..."
Und das 'b' ist ggf über group(1) abzurufen. So zumindest die Theorie.
Dass ein 'x' als letztes Zeichen im String reel nicht gematcht wird, erschließt sich mir auch nicht. Schließlich funktionieren äquivalente Reguläre Ausdrücke wie:
  • x|(b)?cc
  • b?cc|x (Verzicht auf Grp 1)
  • (b){0,1}cc|x (sehr interessant, weil ? = {0,1}

Ansonsten hatte ich im Threadverlauf den Eindruck, dass es nicht verkehrt wäre, wenn Ihr Euch nochmal das Thema Groups sowie greedy/reluctant Quantifiers näher anschaut.

Eine sehr gute Seite zum Thema RegEx ist auch:
externer LinkRegular-Expressions.info

MfG
Björn
PMEmail PosterUsers Website
Top
1 Besucher zu diesem Thema (1 Gäste und 0 'versteckte' Mitglieder)
0 Mitglied(er):

Topic Options Reply to this topicStart new topicStart Poll

 



[ Script Execution time: 0.0296 ]   [ 17 queries used ]   [ GZIP deaktiviert ]
[ Server Uptime: 287 days ] [ Load Average:0.10, 0.03, 0.01 ] [Active HTTP-Connections: 26 ]