2011-07-26 38 views
9

Tôi có chuỗi như dưới đây:Regular Expression - Chụp tất cả các nhóm lặp lại

@[email protected] text [email protected]@another optional text here etc 

chứa @[email protected] dây bên trong.

Tôi muốn nắm bắt tất cả các "biến" này thành các nhóm thông qua một kết hợp regexp nhưng có vẻ như không thể vì regexp chỉ trả về nhóm được thu thập cuối cùng trong khi lặp lại.

+0

Hãy cẩn thận, bạn có thể muốn '@ [^ @] + @' thay vì '@. + @' – sidyll

+0

Tôi quên đặt phiên bản chính xác, nó phải là "@. +? @ –

Trả lời

17

Bạn nói đúng; hầu hết các hương vị regex, bao gồm Java, không cho phép truy cập vào các kết quả riêng lẻ của một nhóm chụp lặp lại. (Perl 6 và .NET cho phép điều này, cho bản ghi, nhưng điều đó không giúp bạn).

Bạn còn có thể làm gì khác?

Pattern regex = Pattern.compile("@[^@][email protected]"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    // matched text: regexMatcher.group() 
    // match start: regexMatcher.start() 
    // match end: regexMatcher.end() 
} 

Điều đó sẽ chụp @[email protected], @[email protected] vv từng cái một.

2

Nếu bạn biết rằng dấu phân cách sẽ là @, thì tại sao không chỉ sử dụng phương thức split (string.split('@'))?

+0

Nó không phải là dấu tách bắt đầu/kết thúc "tag" của thuộc tính/giữ chỗ –

+0

Vâng, trong trường hợp đó, bạn không thể thực hiện 'split', đi qua mảng kết quả và chụp tên thuộc tính và văn bản tùy chọn? –

+0

Làm thế nào bạn có thể biết trong ví dụ dưới đây cái nào là thuộc tính và cái nào là văn bản: "@ @ property @ text" và "văn bản @ property". Split cho bạn ["property", "text"] hoặc ["text", property "]. –

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