2011-10-07 32 views
12

Tôi muốn kiểm tra xem chuỗi có kết thúc bằng một chữ số hay không. Tôi hy vọng dòng Java sau đây sẽ in đúng. Tại sao nó in sai?Regex để kiểm tra xem chuỗi có kết thúc bằng số

System.out.println("I end with a number 4".matches("\\d$")); 
+0

này cũng có thể liên quan đến câu hỏi của bạn: http://stackoverflow.com/questions/627545/java-regexp-problem-www-vs-www – AdrianoKF

Trả lời

8

Trong Java Regex, có sự khác biệt giữa Matcher.find() (tìm một trận đấu bất cứ nơi nào trong String) và Matcher.matches() (phù hợp với toàn bộ chuỗi).

Chuỗi chỉ có một phương pháp matches() (thực hiện tương đương với mã này: Pattern.compile(pattern).matcher(this).matches();), vì vậy bạn cần phải tạo ra một mô hình phù hợp với đầy đủ các String:

System.out.println("I end with a number 4".matches("^.*\\d$")); 
+0

Trên thực tế, đơn giản hơn: System.out.println ("Tôi kết thúc bằng số 4" .matches (". * \\ d")); nhưng '$' có nghĩa là tôi không phải chỉ định. * Ở đầu. Tại sao '$' không hoạt động? – Thor

+0

Phím backspace bổ sung sẽ loại bỏ hành vi thoát. Do đó "^. * \\ d $" có thể không hoạt động. Bạn có thể kiểm tra điều này trong những người kiểm tra regex trực tuyến như sau: http://www.regexplanet.com/simple/index.html – Kash

+0

@Kash trong Java, thêm backspace là cần thiết –

15

regex của bạn sẽ không phù hợp với toàn bộ chuỗi nhưng chỉ phần cuối cùng. Hãy thử mã dưới đây và nó sẽ hoạt động tốt vì nó khớp với toàn bộ chuỗi.

System.out.println("I end with a number 4".matches("^.+?\\d$")); 

Bạn có thể kiểm tra điều này để kiểm tra nhanh chóng vào thử nghiệm regex trực tuyến như thế này: http://www.regexplanet.com/simple/index.html. Điều này cũng cung cấp cho bạn những gì bạn nên sử dụng trong mã Java trong các kết quả có lối thoát thích hợp.

. + sẽ đảm bảo rằng có ít nhất một ký tự trước chữ số. ? sẽ đảm bảo rằng nó có một trận đấu lười thay vì một trận đấu tham lam.

+0

Không có điểm nào làm một trận đấu lười biếng trong trường hợp này. Chúng ta * muốn * '. +' Để gobble lên toàn bộ chuỗi ngay lập tức. Sau đó, nó sẽ trở lại một vị trí để so sánh ký tự cuối cùng với '\ d', đó là điều duy nhất chúng ta quan tâm. –

-1

thử điều này:

System.out.println("I end with a number 4".matches(".*\\d\$")); 
+0

Sẽ không biên dịch, '\ $' là bất hợp pháp trong Java –

1
System.out.println("I end with a number 4".matches(".*\\d")); // prints true 

hoặc

String s = "I end with a number 4"; 
System.out.println(Character.isDigit(s.charAt(s.length()-1))); // prints true 
2

biểu RegEx của bạn là slightly off. Hãy thử điều này:

System.out.println("I end with a number 4".matches("^.*\\d$")); 

Bạn cũng có thể chỉ đơn giản là kiểm tra như thế này nếu bạn đang đánh giá một dòng tại một thời điểm:.

System.out.println("I end with a number 4".matches(".*\\d")); 

biểu hiện ban đầu của bạn, mà không * chỉ được thử nghiệm để xem liệu chuỗi là một số và không tính đến văn bản có thể đứng trước số đó. Đó là lý do tại sao nó luôn luôn là sai.

Sau đây không đánh giá đúng sự thật:

System.out.println("4".matches("^\\d$")); 
Các vấn đề liên quan