2011-10-23 35 views
17
import java.util.regex.Pattern; 

class HowEasy { 
    public boolean matches(String regex) { 
     System.out.println(Pattern.matches(regex, "abcABC ")); 
     return Pattern.matches(regex, "abcABC"); 
    } 

    public static void main(String[] args) { 
     HowEasy words = new HowEasy(); 
     words.matches("[a-zA-Z]"); 
    } 
} 

Kết quả là Sai. Tôi làm sai ở đâu? Ngoài ra tôi muốn kiểm tra xem một từ chỉ chứa các chữ cái và có thể hoặc không kết thúc bằng một dấu chấm đơn. Regex cho điều đó là gì?Làm thế nào để đối sánh các chữ cái chỉ bằng cách sử dụng java regex, phương thức khớp?

tức là "abc" "abc". hợp lệ nhưng "abc .." không hợp lệ.

Tôi có thể sử dụng phương thức indexOf() để giải quyết, nhưng tôi muốn biết liệu có thể sử dụng một regex đơn hay không.

Trả lời

33

"[a-zA-Z]" chỉ khớp với một ký tự. Để khớp nhiều ký tự, hãy sử dụng "[a-zA-Z]+".

Từ một dấu chấm là một Joker cho bất kỳ nhân vật, bạn phải che giấu nó: "abc\." Để thực hiện các chấm tùy chọn, bạn cần có một dấu chấm hỏi: "abc\.?"

Nếu bạn viết các mẫu như không đổi chữ trong mã của bạn , bạn phải che dấu chéo ngược:

System.out.println ("abc".matches ("abc\\.?")); 
System.out.println ("abc.".matches ("abc\\.?")); 
System.out.println ("abc..".matches ("abc\\.?")); 

Kết hợp cả hai mô hình:

System.out.println ("abc.".matches ("[a-zA-Z]+\\.?")); 

Thay o f a-zA-Z, \ w thường là thích hợp hơn, vì nó chụp nhân vật nước ngoài như äöüßø và vân vân:

System.out.println ("abc.".matches ("\\w+\\.?")); 
+0

Bạn có quyền về [a-zA-Z] + bây giờ nó chỉ phù hợp với các chữ cái. Trên thực tế, biểu thức thứ hai phải là "abc \\.?" (trong nhật thực) –

+0

'trong nhật thực' không phải là vấn đề. Bạn có thể nhập một mẫu từ tệp, từ dòng lệnh, từ một JTextField, trái với một hằng số theo nghĩa đen trong mã nguồn - điều này tạo nên sự khác biệt. Tôi đã đề cập trong khi chỉnh sửa ('che dấu gạch chéo ngược '). Cảm ơn dù sao đi nữa. –

+2

Lưu ý rằng '\ w' cũng nắm bắt các dấu gạch dưới và số, tức là' [a-zA-Z_0-9] 'như được định nghĩa trong [Mẫu] (https://docs.oracle.com/javase/7/docs/api /java/util/regex/Pattern.html) – reallynice

0

matches phương pháp thực hiện phù hợp với các dòng đầy đủ, tức là nó tương đương với find() với '^ abc $ '. Vì vậy, chỉ cần sử dụng Pattern.compile("[a-zA-Z]").matcher(str).find() thay thế. Sau đó sửa regex của bạn. Vì @user unknown đã đề cập đến regex của bạn thực sự chỉ khớp với một ký tự. Bạn có thể nên nói [a-zA-Z]+

5

[A-Za-z ]* để khớp các chữ cái và khoảng trắng.

0

Ba vấn đề ở đây:

  1. Chỉ cần sử dụng String.matches() - nếu API là có, sử dụng nó
  2. Trong java "phù hợp" có nghĩa là "phù hợp với toàn bộ đầu vào", mà IMHO là phản trực giác , vì vậy hãy để API của phương pháp phản ánh rằng bằng cách cho phép người gọi suy nghĩ về kết hợp phần của dữ liệu nhập làm ví dụ của bạn gợi ý
  3. Bạn regex chỉ khớp 1 ký tự

tôi khuyên bạn nên sử dụng mã như thế này:

public boolean matches(String regex) { 
    regex = "^.*" + regex + ".*$"; // pad with regex to allow partial matching 
    System.out.println("abcABC ".matches(regex)); 
    return "abcABC ".matches(regex); 
} 

public static void main(String[] args) { 
    HowEasy words = new HowEasy(); 
    words.matches("[a-zA-Z]+"); // added "+" (ie 1-to-n of) to character class 
} 
Các vấn đề liên quan