2009-12-12 25 views
16

Từ hiểu biết của tôi về cụm từ thông dụng, chuỗi "00 ###" phải khớp với "[0-9]", nhưng không khớp với "^ [0-9] $". Nhưng nó không hoạt động với Java regexp.

Sau một số điều tra về vấn đề này, tôi tìm thấy các thông tin sau (http://www.wellho.net/solutions/java-regular-expressions-in-java.html):

Nó có thể xuất hiện mà Java thông thường biểu thức được mặc định neo với cả a^và $ nhân vật.

Chúng ta có thể chắc chắn điều này đúng cho tất cả các phiên bản của JDK không? Và chế độ này có thể bị tắt (tức là tắt khóa mặc định bằng^và $) không?

Trả lời

21

Khi bài viết bạn đã liên kết để giải thích, nó phụ thuộc vào chức năng bạn gọi. Nếu bạn muốn thêm^và $ theo mặc định, hãy sử dụng String#matches hoặc Matcher#matches. Nếu bạn không muốn điều đó, hãy sử dụng phương thức Matcher#find.

import java.util.regex.*; 

public class Example 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Matches: " + "abc".matches("a+")); 

     Matcher matcher = Pattern.compile("a+").matcher("abc"); 
     System.out.println("Find: " + matcher.find()); 
    } 
} 

Output:

Matches: false 
Find: true 
+0

Đây không phải là duy nhất đối với Java, BTW. Python, và tôi cũng tin rằng JavaScript, có một số phương thức regex neo theo mặc định, và những phương thức khác thì không. –

+5

@Laurence: Các phương thức 'test()', 'exec()' và 'match()' của JavaScript đều hoạt động giống nhau: nếu bạn muốn khớp với neo, bạn phải tự neo nó. Mặt khác, phương thức 'match()' của Python hoạt động giống như 'lookAt()' của Java; trận đấu được neo vào đầu chuỗi nhưng không được kết thúc. –

3

Ngoài Mr. Byers's answer, lưu ý quá mà Matcher#find() chọn lên nơi trận đấu thành công cuối cùng của nó rời đi. Điều đó chỉ quan trọng đối với việc sử dụng lặp lại một cá thể Matcher, nhưng đó là tính năng cho phép mô phỏng xác nhận \G của Perl. Nó cũng hữu ích trong buổi hòa nhạc với Matcher#usePattern(Pattern), trong đó bạn sử dụng một mẫu để tìm một số tiền tố và sau đó hoán đổi theo mẫu lặp lại (bao gồm \G) để lặp qua các kết quả lặp lại với Matcher#find().

Ngoài ra còn có Matcher#lookingAt(), bị chặn hoàn toàn ngay từ đầu (^) nhưng không phải ở cuối. Tôi thích nghĩ rằng cái tên đó được lấy cảm hứng từ hàm Emacs looking-at.

3

Có, matches() luôn hoạt động như thể regex được neo ở cả hai đầu. Để có được hành vi truyền thống, để phù hợp với bất kỳ chuỗi con nào của đích, bạn phải sử dụng find() (như những người khác đã chỉ ra). Rất ít công cụ regex cung cấp bất cứ thứ gì tương đương với các phương thức matches() của Java, vì vậy sự nhầm lẫn của bạn là hợp lý. Người duy nhất tôi có thể nghĩ ra là một hương vị XML Schema.

Các vấn đề liên quan