2010-09-09 42 views
6

Tôi cần tìm regex cho []Regex cho bất kỳ thứ gì giữa []

Ví dụ: nếu chuỗi là - Xin chào [Đây là [Tag] của tôi.

Nó sẽ trả về Stack, Tag, Tìm

+1

Trên nền tảng nào? Trong ngôn ngữ lập trình nào? –

+0

asp.net. Tôi đang sử dụng Regex.IsMatch() – Ankit

+2

Có thể có các kết quả lồng nhau: 'foo [bar [baz]] done' mà bạn muốn lấy' bar [baz] '? Hoặc có lẽ 'foo [bar \\] baz] done' nơi bạn muốn lấy' bar] baz'? Có thể có (các) dòng mới giữa '[' và ']' không? –

Trả lời

26

Khá đơn giản, bạn chỉ cần (1) thoát khỏi dấu ngoặc với gạch chéo ngược, và (2) sử dụng (.*?) để nắm bắt được nội dung.

\[(.*?)\] 

Dấu ngoặc đơn là nhóm chụp, chúng nắm bắt nội dung của chúng để sử dụng sau này. Dấu chấm hỏi sau .* làm cho không phù hợp với tham lam. Điều này có nghĩa là nó sẽ khớp với trận đấu ngắn nhất có thể, thay vì trận đấu dài nhất có thể. Sự khác biệt giữa tham lam và tham lam xuất hiện khi bạn có nhiều kết quả phù hợp trong một dòng:

Hi [Stack], Here is my [Tag] which i need to [Find]. 
    ^______________________________________________^ 

Kết hợp tham lam sẽ tìm chuỗi dài nhất có thể giữa hai bộ ngoặc vuông. Điều đó không đúng. Một trận đấu không tham lam sẽ tìm ra ngắn nhất:

Hi [Stack], Here is my [Tag] which i need to [Find]. 
    ^_____^ 

Anyways, mã sẽ kết thúc looking like:

string regex = @"\[(.*?)\]"; 
string text = "Hi [Stack], Here is my [Tag] which i need to [Find]."; 

foreach (Match match in Regex.Matches(text, regex)) 
{ 
    Console.WriteLine("Found {0}", match.Groups[1].Value); 
} 
3
\[([\w]+?)\] 

nên làm việc. Bạn có thể phải thay đổi nhóm phù hợp nếu bạn cần bao gồm các ký tự đặc biệt.

+0

Điều này hoạt động tốt hơn một chút so với câu trả lời hiện được gắn thẻ bởi vì nó có quyền kiểm soát tốt hơn những thứ như sau: "Test [test] [test [test]" Câu trả lời được gắn thẻ sẽ bao gồm cả stray [trong trận đấu, trong khi regex này sẽ không . – StronglyTyped

3

Tùy thuộc vào những gì bạn có nghĩa là môi trường:

\[([^\]]+)] 
+0

Ah, .NET ... Đây là một regex Emacs. :-) –

+1

Tôi nghĩ bạn đã bỏ lỡ một ']' ngay cả trong cú pháp Emacs. – kennytm

+1

Tôi đã tự do thay đổi nó thành một .NET tương thích. Lưu ý rằng ']' chỉ cần thoát bên trong bộ ký tự, không phải bên ngoài nó (mặc dù nó không làm tổn thương để thoát khỏi nó ...). –

0

cú pháp NET, chăm sóc nhiều dấu ngoặc nhúng:

\[ ((?: \\. | (?<OPEN> \[) | (?<-OPEN> \]) | [^\]])*? (?(OPEN)(?!))) \]

này đếm số mở [ phần trong OPEN và chỉ thành công nếu OPEN là 0 cuối cùng.

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