2011-01-09 17 views
3

Wie kann ich nach der ersten Übereinstimmung des regulären Ausdrucks zurückkehren? (macht die Matcher.find() Methode das?)Java Regex Rückkehr nach dem ersten Spiel

sagen wir habe eine Zeichenfolge "abcdefgeee". Ich möchte die Regex-Engine bitten, sofort nach dem Finden der ersten Übereinstimmung von "e" zum Beispiel zu finden. Ich schreibe eine Methode, um wahr/falsch zurückzugeben, wenn das Muster gefunden wird und ich nicht die ganze Zeichenfolge für "e" finden möchte. (Ich suche nach einer Regex-Lösung)

Eine andere Frage, manchmal, wenn ich matches() verwende, wird es nicht korrekt zurückgegeben. Zum Beispiel, wenn ich mein Muster wie "[a-z]" kompiliere. und dann verwendet matchs(), es stimmt nicht überein. Aber wenn ich das Muster als ".*[a-z].*" kompiliere, stimmt es überein .... ist das das Verhalten der Matches() -Methode der Matcher-Klasse?

Bearbeiten, hier ist eigentlich, was ich tun möchte. Zum Beispiel möchte ich nach einem $ -Zeichen und einem @ -Zeichen in einer Zeichenfolge suchen. Also würde ich 2 kompilierte Muster definieren (da ich kein logisches UND für Regex finden kann, da ich die Grundlagen kenne).

pattern1 = Pattern.compiled("$"); 
pattern2 = Pattern.compiled("@"); 

dann würde ich

if (match1.find() && match2.find() ){ 
    return true; 
} 

in meiner Methode verwenden nur.

Ich möchte nur die Matcher die Zeichenfolge für das erste Auftreten und Rückkehr suchen.

dank

+0

Ihre erste Frage ist verwirrend Sie sagen, Sie wollen um wahr/falsch zurück zu geben, aber dann sagst du, du willst aufhören zu suchen, nachdem du eine Übereinstimmung gefunden hast? Ein Regex wird nur passen oder nicht. – jzd

+0

Entschuldigung, ich habe ein bisschen auf die Frage aktualisiert. – ghostdog74

Antwort

2

Für Ihre zweite Frage, passt richtig funktioniert, können Sie beispielsweise verwendet zwei verschiedene reguläre Ausdrücke.

.*[a-z].* wird mit einem String übereinstimmen, der mindestens ein Zeichen hat. [a-z] wird nur eine eine Zeichenfolge entsprechen, die Kleinbuchstaben a-z ist. Ich denke, dass Sie vielleicht etwas wie [a-z]+

+0

Wenn ich [a-z] als kompiliertes Muster habe, stimmt das nicht zum Beispiel mit "2a" überein? Wenn ich zum Beispiel nur "e" suchen möchte, dann sollte mein kompiliertes Muster "e" sein und nicht "e +", da ich nur nach einem "e" suchen möchte. hmmm ... irre ich das zu sagen? Entschuldigung, bin Anfänger in Regex – ghostdog74

+0

Wenn Sie Muster "[a-z]" haben, würde es nur "a" übereinstimmen und "2" weglassen. Wenn Ihre Zeichenfolge jedoch Zeichen von a bis z enthält, gibt Matcher.find() true zurück. – Rogach

1

verwenden möchten Eine andere Frage, manchmal, wenn ich matches(), wird es nicht korrekt zurückgegeben. Zum Beispiel, wenn ich mein Muster wie "[a-z]" kompiliere. und dann verwendet matchs(), es stimmt nicht überein. Aber wenn ich das Muster kompilieren als ". [a-z].", es entspricht .... ist das das Verhalten der Matches() -Methode der Matcher-Klasse?

Ja, matches(...) testet die gesamte Zielzeichenfolge.

... hier ist eigentlich, was ich tun möchte. Zum Beispiel möchte ich nach einem $ -Zeichen und einem @ -Zeichen in einer Zeichenfolge suchen. Also würde ich 2 kompilierte Muster definieren (da ich kein logisches UND für Regex finden kann, da ich die Grundlagen kenne).

Ich weiß, Sie sagten, Sie wollten Regex verwenden, aber alle Beispiele scheint darauf hinzudeuten Sie keine Notwendigkeit für sie haben: das sind alles versengen Zeichen, die mit ein paar indexOf(...) Anrufe gehandhabt werden kann.

Wie auch immer, regex verwenden, können Sie es wie folgt tun:

public static boolean containsAll(String text, String... patterns) { 
    for(String p : patterns) { 
     Matcher m = Pattern.compile(p).matcher(text); 
     if(!m.find()) return false; 
    } 
    return true; 
} 

Aber noch einmal: indexOf(...) würde auch den Trick:

public static boolean containsAll(String text, String... subStrings) { 
    for(String s : subStrings) { 
     if(text.indexOf(s) < 0) return false; 
    } 
    return true; 
}