Tôi vừa quan sát hành vi này;Cụm từ thông dụng không khớp với chuỗi rỗng ở chế độ nhiều dòng (Java)
Pattern p1 = Pattern.compile("^$");
Matcher m1 = p1.matcher("");
System.out.println(m1.matches()); /* true */
Pattern p2 = Pattern.compile("^$", Pattern.MULTILINE);
Matcher m2 = p2.matcher("");
System.out.println(m2.matches()); /* false */
Nó đánh tôi là kỳ lạ khi tuyên bố cuối cùng là sai. Đây là những gì các tài liệu nói;
Theo mặc định, cụm từ thông dụng^và $ bỏ qua dòng và chỉ kết hợp ở đầu và cuối tương ứng của toàn bộ chuỗi đầu vào. Nếu chế độ MULTILINE được kích hoạt thì^đối sánh ở đầu đầu vào và sau bất kỳ đầu cuối dòng nào ngoại trừ ở cuối đầu vào. Khi ở chế độ MULTILINE $ phù hợp ngay trước một trình kết thúc dòng hoặc kết thúc chuỗi đầu vào. http://docs.oracle.com/javase/1.4.2...
Từ những gì tôi nhận được từ điều này, nó phải khớp? Sau đây làm cho mọi việc trở nên khó hiểu hơn;
Pattern p3 = Pattern.compile("^test$");
Matcher m3 = p3.matcher("test");
System.out.println(m3.matches()); /* true */
Pattern p4 = Pattern.compile("^test$", Pattern.MULTILINE);
Matcher m4 = p4.matcher("test");
System.out.println(m4.matches()); /* true */
Vậy đây là gì? Làm thế nào để tôi hiểu được điều này? Tôi hy vọng ai đó có thể làm sáng tỏ điều này, sẽ thực sự được đánh giá cao.
Đây là Java SE 6 (hệ điều hành MacOS X Default) –
Chỉ cần thử nó trên OpenJDK (IcedTea6 1.9.10) và hành vi kỳ lạ cùng nắm giữ. –
Tương tự trên Oracle JRE 7 – Ingo