Nếu bạn chỉ đơn giản là cần phải nhận được bất cứ điều gì là giữa []
, các bạn có thể sử dụng \[([^\]]*)\]
như thế này:
Pattern regex = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = regex.matcher(str);
if (m.find()) {
result = m.group();
}
Nếu bạn cần nó để có dạng identifier + [ + content + ]
sau đó bạn có thể giới hạn trích xuất nội dung chỉ khi số nhận dạng là chữ và số:
[a-zA-Z][a-z-A-Z0-9_]*\s*\[([^\]]*)\]
Điều này sẽ valida ví dụ như số điện thoại Foo [Bar]
hoặc myDevice_123["input"]
.
vấn đề chính
Vấn đề chính là khi bạn muốn trích xuất nội dung của một cái gì đó như thế này:
FOO[BAR[CAT[123]]+DOG[FOO]]
Các Regex sẽ không hoạt động và sẽ trở lại BAR[CAT[123
và FOO
.
Nếu chúng ta thay đổi Regex để \[(.*)\]
sau đó chúng tôi OK nhưng sau đó, nếu bạn đang cố gắng để trích xuất nội dung từ những điều phức tạp hơn như:
FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]
Không ai trong số các Regexes sẽ làm việc.
Regex chính xác nhất để trích xuất nội dung phù hợp trong mọi trường hợp sẽ phức tạp hơn rất nhiều vì cần cân bằng các cặp []
và cung cấp cho bạn nội dung đó.
Một giải pháp đơn giản hơn
Nếu vấn đề của bạn là nhận phức tạp và nội dung của []
tùy ý, bạn thay vì có thể cân bằng cặp []
và trích xuất các chuỗi sử dụng đồng bằng đang nở sớm già hơn một Regex:
int i;
int brackets = 0;
string c;
result = "";
for (i = input.indexOf("["); i < str.length; i++) {
c = str.substring(i, i + 1);
if (c == '[') {
brackets++;
} else if (c == ']') {
brackets--;
if (brackets <= 0)
break;
}
result = result + c;
}
Đây là mã giả hơn mã thực, tôi không phải là người lập trình Java nên tôi không biết cú pháp có chính xác hay không, nhưng phải dễ dàng cải thiện.
Số lượng mã này sẽ hoạt động và cho phép bạn trích xuất nội dung của số []
, tuy nhiên nó phức tạp.
Điều đáng nói đến là nếu có một dòng mới giữa các dấu ngoặc vuông, điều này sẽ thất bại và bạn nên sử dụng cờ Pattern.DOTALL để tránh điều đó. – cletus
Sử dụng mẫu ở trên, sau đó bạn sẽ sử dụng mẫu đó để trích xuất chuỗi chứa chuỗi BAR? Tôi đang xem API mẫu và API của Matcher nhưng tôi vẫn không chắc chắn làm thế nào để có được chuỗi đó. – digiarnie
@cletus: Cuộc gọi tốt! @digiarnie: Tôi đã thêm bản sửa đổi cho câu trả lời có chứa một số mã rơm-man để nhận được trận đấu. –