Ich unterstütze diese Java-Anwendung, wo die Entwickler einige Filter basierend auf RegEx implementiert. Um so generisch wie möglich zu sein, kompilieren sie die Muster mit dem MULTILINE-Flag.
Neulich bemerkte ich etwas unerwartetes. In Java stimmt das Muster "^\\s*$"
nicht mit dem MULTILINE-Flag ""
überein. Es passt ohne diese Flagge.
Pattern pattern = Pattern.compile("^\\s*$", Pattern.MULTILINE);
Matcher matcher = pattern.matcher("");
System.out.println("Multiline: "+matcher.find());
pattern = Pattern.compile("^\\s*$");
matcher = pattern.matcher("");
System.out.println("No-multiline: "+matcher.find());
Dies erzeugt die folgende Ausgabe
Multiline: false
Non-Multiline: true
Gleiche Ergebnisse können für matches()
zu sehen:
System.out.println("Multiline: " + ("".matches("(?m)^\\s*$")));
System.out.println("No-multiline: " + ("".matches("^\\s*$")));
Ich würde alle Fälle erwarten zu lassen.
In Python ist dies der Fall. Dies:
import re
print(re.search(r'^\s*$', "", re.MULTILINE))
print(re.search(r'^\s*$', ""))
gibt:
<_sre.SRE_Match object; span=(0, 0), match=''>
<_sre.SRE_Match object; span=(0, 0), match=''>
In Perl, in beiden Fällen entsprechen, wie gut und ich glaube, ich erinnere mich, es ist die gleiche für PHP zu sein.
Ich würde wirklich schätzen, wenn jemand die Gründe hinter der Art erklären könnte, wie Java diesen Fall behandelt.
Sie haben Recht. Das kam von mir, wenn ich nach den Unterschieden zwischen match() und find() suche. Das Verhalten ist jedoch in beiden Fällen mit beiden Methoden reproduzierbar. Ich habe meine Frage aktualisiert, um find() in beiden Fällen zu verwenden – shmee
Ich wollte nur [den Link zur IDEONE-Demo] (http://ideone.com/1ZoX3V) teilen, der zeigt, dass das Problem mit 'find()' vorhanden ist, auch. –
[Diese Frage] (http://stackoverflow.com/questions/8896201/regular-expression-doesnt-match-empty-string-in-multiline-mode-java) kann einige Einblicke liefern. – sgbj