2011-11-10 34 views
6

Làm cách nào để giải quyết vấn đề regex Java này?Regex: Làm thế nào để nắm bắt điều này? (một nhóm lồng nhau bên trong một nhóm lặp lại)

Input:

some heading text... ["fds afsa","fwr23423","42df f","1a_4([email protected]#","3240acg!g"] some trailing text....

Vấn đề: Tôi muốn nắm bắt tất cả mọi thứ giữa dấu ngoặc kép. (Ví dụ: FDS afsa, fwr23423, vv)

Tôi đã thử các mô hình sau:

\[(?:"([^"]+)",?)+\]

Nhưng khi thực hiện một Matcher.find(), nó sẽ gây ra một StackOverflowError, khi sử dụng một đầu vào lớn hơn (nhưng làm việc cho một đầu vào nhỏ, đây là một lỗi trong Java). Và ngay cả khi nó đã làm việc, sau đó matcher.group (1) sẽ chỉ cung cấp cho "3240acg! G".

Tôi làm cách nào để giải quyết vấn đề này? (Hoặc là sử dụng nhiều mẫu bắt buộc, trong đó mẫu đầu tiên tách các dấu ngoặc vuông?)

Trả lời

1

Nhận chuỗi giữa [ ] và sau đó chia cho dấu phẩy. Nó dễ dàng hơn nhiều.

1

Ba gợi ý:

Nếu chuỗi chỉ có thể xảy ra giữa dấu ngoặc, sau đó bạn không cần phải kiểm tra cho họ ở tất cả và chỉ sử dụng "[^"]*" như regex của bạn và tìm thấy tất cả các trận đấu (giả sử không có dấu ngoặc kép thoát).

Nếu điều đó không hoạt động vì dây có thể xảy ra ở những nơi khác, nơi bạn không muốn chụp chúng, hãy thực hiện theo hai bước.

  1. Khớp \[[^\]]*\].
  2. Tìm tất cả các lần xuất hiện của "[^"]*" trong kết quả của trận đấu đầu tiên. Hoặc thậm chí sử dụng trình phân tích cú pháp JSON để đọc chuỗi đó.

khả năng thứ ba, gian lận một chút:

Tìm kiếm "[^"\[\]]*"(?=[^\[\]]*\]). Điều đó sẽ khớp với một chuỗi chỉ khi khung tiếp theo sau là một khung đóng. Giới hạn: Không cho phép dấu ngoặc trong các chuỗi. Tôi xem xét việc này xấu xí, đặc biệt là nếu bạn nhìn vào cách nó sẽ trông giống như trong Java:

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile("\"[^\"\\[\\]]*\"(?=[^\\[\\]]*\\])"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

Bạn có nghĩ rằng bất cứ ai nhìn vào điều này trong một vài tháng có thể nói những gì nó đang làm gì?

+0

Vì vậy, cần có nhiều mẫu/kết quả phù hợp. Tôi tìm thấy một cái gì đó tương tự ở đây: http://answers.oreilly.com/topic/222-how-to-find-a-match-within-another-match-in-a-regular-expression/ – Devabc

+0

Vâng, OK, có là một cách khác, nhưng tôi không nghĩ đó là một cách tốt. Tôi đã thêm nó vào câu trả lời của tôi. –

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