PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String suche mit Wildcards


robbyh_da
19.05.2009, 16:30
Hallo in die Runde,

ich habe ein kleines Problem mit einem RegEx. Bei mir ist es leider schon ein wenig länger her das ich mich mit RegEx's beschäftigt habe. Aber zu meinem Problem.
Im Grund habe ich in einer Java App einen String, der enthält zum Beispiel: "Ich bin ein Test String". Ich benötige jetzt eine RegEx der mir nach einem Teilstring mit Wildcards sucht. Zum Beispiel: "bin ein". Das Problem ist das ich NICHT weis ob "Ich bin ein Test String" nicht vielleicht auch so: "Ich_bin_ein_Test_String", oder so "Ich_bin.ein-Test_ String" aussieht. Ich weiss nur das die zwei Worte "bin" und "ein" vorkommen und von maximal einem Zeichen voneinander getrennt sind. Ich benötige als ein RegEx der auf dieses Kriterium matched. Hier mein Ansatz (funktioniert nur leider nicht ;)):

searchIn.matches("*.[bin].[ein].*");


P3000
19.05.2009, 16:36
/bin.ein/
würde mir jetzt spontan einfallen, dein Ansatz
*.[bin].[ein].*
kann deswegen nicht hinhauen, da innerhalb von eckigen Klammern EINES der Zeichen darin matcht, also entweder ein b, ein i oder ein n.
Außerdem geht *. auch nicht einfach so. :D

robbyh_da
19.05.2009, 16:48
Hi,

habe es gerade Probiert, klappt leider auch nicht.

P3000
19.05.2009, 16:52
Mit searchIn.matches("/bin.ein/");? Die / sind vllt in Java zu vernachlässigen, ich schreib die nur aus Gewohnheit mit... also eher

searchIn.matches("bin.ein");

robbyh_da
19.05.2009, 16:55
Mit searchIn.matches("/bin.ein/");? Die / sind vllt in Java zu vernachlässigen, ich schreib die nur aus Gewohnheit mit... also eher

searchIn.matches("bin.ein");

Habe ich auch gerade probiert. Macht er aber auch nicht. Habe es gerade mit Notepad++ probiert. In dem Ding kann man mit RegEx suchen. Da klappt es. Benutzt Java vielleicht ein anderes Zeichen für Wildcards?

P3000
19.05.2009, 16:57
Der . ist eigentlich ziemlich universell zu verwenden...

Aber vielleicht gibt .matches() nur dann true zurück wenn ein kompletter Match vorliegt... in diesem Falle also

searchIn.matches(".*?bin.ein.*");

robbyh_da
19.05.2009, 17:01
Der . ist eigentlich ziemlich universell zu verwenden...

Aber vielleicht gibt .matches() nur dann true zurück wenn ein kompletter Match vorliegt... in diesem Falle also

searchIn.matches(".*?bin.ein.*");

klappt leider auch ncht. Dieses mal aber auch in Notepad++ nicht. Wobei ich glaube das der Ansatz schon ganz gut ist. Vieleicht irgend ein fehler in dem RegEx?

robbyh_da
19.05.2009, 17:10
Aua, klappt doch. Deine zweite Antwort war schon die richtige. Ich habe es nur verpeilt ^^

eViL_oNe
19.05.2009, 20:15
grundsätzlich müsstest du eigentlich den Punkt maskieren, da du hier offensichtlich nicht ein beliebiges Zeichen, sondern wirklich den Punkt meinst.

der richtige Ausdruck würde lauten:

/bin\.ein/

in Java übersetzt muss man natürlich den Backslash noch escapen:

"bin\\.ein"

hierbei gilt noch zu beachten, dass matches die ganze Zeichenkette gegen das Pattern prüft: http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#matches()

dies wurde allerdings ja schon oben angedeutet. Man muss also vorher und nachher wildcards einführen, sofern man tatsächlich mit matches arbeiten will. Besser wäre wohl das Arbeiten mit find da man hier nicht auf ein sinnloses Backtracking ala .*? angewiesen ist:

http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#find()

Dies setzt natürlich voraus, dass man direkt mit Pattern und Matcher arbeitet, was allerdings eher Vorteile als Nachteile bedeutet (insbesondere wenn man das Pattern wiederverwenden will!)

Manni the Dark
23.05.2009, 18:18
grundsätzlich müsstest du eigentlich den Punkt maskieren, da du hier offensichtlich nicht ein beliebiges Zeichen, sondern wirklich den Punkt meinst.

der richtige Ausdruck würde lauten:

/bin\.ein/

in Java übersetzt muss man natürlich den Backslash noch escapen:

"bin\\.ein"

hierbei gilt noch zu beachten, dass matches die ganze Zeichenkette gegen das Pattern prüft: http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#matches()

dies wurde allerdings ja schon oben angedeutet. Man muss also vorher und nachher wildcards einführen, sofern man tatsächlich mit matches arbeiten will. Besser wäre wohl das Arbeiten mit find da man hier nicht auf ein sinnloses Backtracking ala .*? angewiesen ist:

http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#find()

Dies setzt natürlich voraus, dass man direkt mit Pattern und Matcher arbeitet, was allerdings eher Vorteile als Nachteile bedeutet (insbesondere wenn man das Pattern wiederverwenden will!)

Öhm, soweit ich das verstanden habe, will er doch gerade ein beliebiges Zeichen matchen...