2012-06-22 39 views
11

Tôi đã tự hỏi liệu Java có tương đương với mẫu phù hợp với mẫu C# không. Ví dụ: trong C# Tôi có thể làm điều gì đó như sau:Hỗ trợ Java cho mẫu ((? <name>) "trong các mẫu

var pattern = @";(?<foo>\d{6});(?<bar>\d{6});"; 
var regex = new Regex(pattern , RegexOptions.None); 
var match = regex.Match(";123456;123456;"); 

var foo = match.Groups["foo"].Success ? match.Groups["foo"].Value : null; 
var bar = match.Groups["bar"].Success ? match.Groups["bar"].Value : null; 

Điều này có vẻ như một cách gọn gàng để lấy nhóm. Java có thể làm một cái gì đó tương tự, hay tôi cần phải lấy các nhóm dựa trên vị trí chỉ mục?

String foo = matcher.group(0); 
+0

Một trong những điều khó chịu nhất về java = \ – Falmarri

Trả lời

16

này được hỗ trợ bắt đầu từ năm Java 7. Mã của bạn C# có thể được dịch sang một cái gì đó như thế này:

String pattern = ";(?<foo>\\d{6});(?<bar>\\d{6});"; 
Pattern regex = Pattern.compile(pattern); 
Matcher matcher = regex.matcher(";123456;123456;"); 
boolean success = matcher.find(); 

String foo = success ? matcher.group("foo") : null; 
String bar = success ? matcher.group("bar") : null; 

Bạn phải tạo một đối tượng Matcher mà không thực sự thực hiện các thử nghiệm regex cho đến khi bạn gọi find().

(tôi đã sử dụng find() bởi vì nó có thể tìm thấy một trận đấu bất cứ nơi nào trong chuỗi đầu vào, như phương pháp Regex.Match(). Phương pháp .matches() chỉ trả về true nếu regex phù hợp với toàn bộ chuỗi đầu vào.)

+1

Cảm ơn bạn đã trả lời nhanh. Thật không may, chúng tôi vẫn đang sử dụng Java 6. Có lẽ tôi sẽ chỉ tạo một enum: String foo = matcher.group (MyGroups.FOO); – aelstonjones

+1

Xem dự án [named-regexp] (http://code.google.com/p/named-regexp/). Mục đích cụ thể của nó là cung cấp một cách để xử lý các nhóm được đặt tên trước Java7. – matts

+1

Đã cập nhật ngã ba cập nhật của ['named-regexp'] (http://tony19.github.io/named-regexp). – user46874

-2

Tôi tin rằng bạn cần nhập

org.apache.commons.lang3.StringUtils;

cho điều này

private Boolean validateEmail(String email) 
    { 
     return email.matches("^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\\.[a-zA-Z](-?[a-zA-Z0-9])*)+$"); 
    } 

    private Boolean validateIP(String IP) 
    { 
     return IP.matches("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); 
    } 

    private Boolean validateHostname(String Hostname) 
    { 
     return Hostname.matches("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])$"); 
    } 
+0

có thể đã hiểu sai câu hỏi. đọc lại nó và bây giờ điều này không có vẻ như những gì bạn muốn. không biết những gì bạn có nghĩa là bởi "lấy nhóm" –

+0

Về cơ bản, tôi muốn có một cách sạch sẽ để lấy một mô hình phù hợp từ mảng nhóm mà không cần sử dụng số chỉ số mà là một tên thay thế. – aelstonjones

2

Java v1.7 tại hỗ trợ các nhóm được đặt tên theo tiêu chuẩn Perl như (?<name>...)\k<name> trong các mẫu.

Bạn không thể có tên nhóm trùng lặp trong cùng một mẫu, điều này có thể gây phiền toái trong các trường hợp rất phức tạp khi bạn tạo các mẫu lớn hơn trong số các phần nhỏ ngoài tầm kiểm soát của mình. Nó cũng thiếu lập chỉ mục tương đối.

Tuy nhiên, nó sẽ là đủ cho những điều đơn giản như bạn dường như được viết.

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