2012-04-04 3 views
1

Es gibt etwas, das ich in den regulären Ausdrücken von Java nicht verstehe. Ich habe die folgende Zeichenfolge (und ich brauche die „Date“):Warum stimmt der reguläre Ausdruck nicht überein, ohne den Grenzabgleich "Anfang der Zeile"?

From Date :01/11/2011 To Date :30/11/2011;;;;;;;;;;;;; 

Ich denke, dass der folgende reguläre Ausdruck (in Perl) würde abgestimmt haben.

to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}) 

In Java stimmt dieses Muster nicht überein. Aber es tut, wenn ich vor und am Ende hinzufügen, ein .+ So dieses Muster funktioniert in Java:

Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE); 

Was ich nicht verstehe: Es wäre mir klar, dass das erste Muster würde nicht überein Java, wenn ich ein ^ (Anfang der Zeile) und ein $ am Ende der Zeile hinzufügen. Das würde bedeuten, dass das Muster der ganzen Linie entsprechen muss. Aber ohne das sollte das erste Muster tatsächlich übereinstimmen, denn warum kümmert sich das Muster um Zeichenkettendaten, die außerhalb des Bereichs dieses Musters liegen, wenn ich keine Begrenzer vor und am Ende setze? Das ist für mich nicht logisch. Meiner Meinung nach sollte sich das erste Muster ähnlich wie die "contains" -Methode der String-Klasse verhalten. Und ich denke es ist so in Perl.

+0

Sie können Java regexp bei [regexplanet] (http://www.regexplanet.com/advanced/java/index.html) testen. Ich konnte nicht einmal dein Muster mit den. + 'Darin arbeiten. –

Antwort

6

In Java validiert matches() die gesamte Zeichenfolge. Ihre Eingabe enthält wahrscheinlich Zeilenumbrüche (die nicht mit .+ übereinstimmen).

Versuchen Sie stattdessen:

Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher("... \n From Date :01/11/2011 To Date :30/11/2011;;;;;;;;;;;;; \n ..."); 

System.out.println(m.matches()); // prints false 

if(m.find()) { 
    System.out.println(m.group(1)); // prints 30/11/2011 
} 

Und wenn find() verwenden, können Sie Ihre die .+ ‚s aus dem Muster fallen:

Pattern.compile("to\\s+date\\s*?:\\s*?([0-9]{2}[./][0-9]{2}[./][0-9]{2,4})", Pattern.CASE_INSENSITIVE); 

(keine Notwendigkeit, die . innerhalb einer Zeichenklasse zu entkommen , btw)

+0

Ok, "finde" ist der Trick. Btw: Du hast recht, ich kann die Escape-Zeichen in der Zeichenklasse weglassen, wusste das nicht. – Bevor