2011-12-15 33 views
15

Tôi muốn khớp bất kỳ thứ gì bên trong dấu ngoặc đơn nhưng kết quả cũng phải loại trừ các dấu ngoặc đơn.C# Regex khớp với bất kỳ thứ gì bên trong dấu ngoặc đơn

Ví dụ:
Initialize (P90W)
phanh (45X)

Kết quả:
990W
45X

lưu ý kết quả mà không có ngoặc.

Tôi đã cố gắng để thực hiện công việc này nhưng vô ích, tôi đã thử một vài biến thể nhưng tôi biết đó là một điều đơn giản tôi thiếu và tôi không muốn sử dụng Thay thế để đạt được điều đó.

var item = "Brake(45X)" 
Regex searchTerm = new Regex(@"\((.*)\)"); 
var value = (searchTerm.Match(item).Groups.Count > 0) ? 
    searchTerm.Match(item).Groups[0].Value : string.Empty; 
+0

Tôi không biết C#, nhưng là một 'mới Regex()' giả định là cơ bản, mở rộng, hoặc preg? Bạn đã thử chuyển đổi bộ dấu ngoặc nào được thoát bằng dấu gạch chéo ngược chưa? Có lẽ '\ (' có nghĩa là "đánh dấu bắt đầu của phạm vi" và '(' là một paren chữ? – ghoti

+0

Điều này có vẻ tốt với tôi, những gì đang xảy ra? 'Giá trị' là' string.Empty'? Giá trị –

+0

trở lại (P90W) hoặc (45X) với dấu ngoặc đơn –

Trả lời

27

Một số người buộc tội tôi sử dụng không khẳng định chiều rộng tất cả các thời gian:

resultString = Regex.Match(subjectString, @"(?<=\().+?(?=\))").Value; 

Nhưng họ thực hiện chính xác những gì bạn muốn. Không nắm bắt những gì bạn không muốn chụp.

+5

Tại sao bạn cần lookahead và lookbehind? '@" \ (([^ \)] *) \) "' là đơn giản hơn nhiều, và 4 ký tự ngắn hơn :) – kol

+0

Điều này là tuyệt vời, bình luận của kol là tuyệt vời là tốt, nhưng tôi sẽ nói rằng câu trả lời của FailedDev dạy tôi làm điều gì đó mà tôi không biết trước đây – Feign

0
Regex searchTerm = new Regex(@"\(([^\)]*)\)"); 
10

thử regex @"\((.*?)\)"

EDIT: Ngoài ra kết quả sẽ là nhóm 1 không phải là 0, nhóm 0 nên chứa toàn bộ kết quả regex, không phải là giá trị trong ngoặc đơn đầu tiên

+0

Hữu ích! Tôi cần tìm tất cả các phần chuỗi bên trong dấu ngoặc nhọn, vì vậy hãy sử dụng mã đơn giản này: chuỗi mẫu = @ "{(. *?)}"; MatchCollection matches = Regex.Matches ( – Pisu

3

Tháo bên trong paranthesis và thử lại:

new Regex(@"(\([^\)]+\))"); 

Khi bạn không thoát khỏi paranthesi s trong regex, nếu bạn đang sử dụng nhóm phù hợp, nó sẽ chỉ trả lại nội dung trong dấu ngoặc đơn. Vì vậy, nếu bạn có, new Regex(@'(a)(b))', kết quả 1 sẽ là một và kết hợp 2 sẽ là b. Trận đấu 0 là toàn bộ trận đấu.

+0

Một bình luận, nếu bạn muốn bỏ trống quá nhiều: (\ ([^ \)] * \)) – Dani

0

thử điều này:

var pattern = @".*public.*(.*\(.*\))"; 
Regex.Matches(input,pattern) 
Các vấn đề liên quan