2013-08-06 38 views
5

Khi triển khai một trình phân tích tập lệnh nhỏ, tôi đã gặp một vấn đề với mẫu mã này - khi chỉ muốn chọn phần giữa và bao gồm câu lệnh "if {}", đó là tham lam và chọn tất cả bao gồm cả dòng cuối cùng. Tôi đoán những gì tôi nên sử dụng là một lookahead tiêu cực.C# RegEx ngăn chặn tham lam phù hợp với cùng một mẫu lặp lại

if [condition1] 
{ 
    task1 
    setparameters{a} 
    task2 
} 

if [condition2] 
{ 
    task3 
} 

setparameters{b} 

Hiện nay, tôi có:

if\b\s\[.*\]\s\{(\s|.)*\} 

Tôi đoán đó là không đơn giản như phá vỡ trên một 'nếu', hoặc, như cái gì khác có thể đến trước đó. Có thể đếm một số bằng nhau của niềng răng mở và đóng? Hoặc là có một số cách kỳ diệu khác mà tôi chỉ có thể chọn một trong những tuyên bố 'nếu'?

+1

Bạn cần tìm hiểu về '?' Và ý nghĩa của nó trong Regex. Khắc phục: 'if \ b \ s \ [. * \] \ S \ {(\ s |.) *? \}' –

+0

Có lẽ tôi nên thêm một chút trình độ chuyên môn nữa là tại sao tôi không làm * không tham lam - có khả năng là một dấu ngoặc đóng} có thể xuất hiện trong vòng lặp. Tôi đã cập nhật bản gốc để hiển thị điều này. –

+0

Ah, sau đó bạn bắt đầu xem xét các nhóm cân bằng. Tôi không biết chúng là gì, vì vậy tôi đã đăng một câu hỏi. Câu trả lời là tuyệt vời. Đọc nó: [Nhóm cân bằng biểu thức chính quy là gì?] (Http://stackoverflow.com/questions/17003799/What-are-regular-expression-balancing-groups) –

Trả lời

0

Sử dụng dấu "?" như một vòng loại làm cho một "*" không tham lam. Trong thực tế, nó có thể là tốt hơn để sử dụng "+":

\[.+?]

Như @ It'sNotALie nói (diễn giải), bạn sẽ được hưởng lợi từ một chút giải thích:

A sample of a nice tutorial

2

Tôi đã gặp phải sự cố tương tự khi tôi cố gắng phát hiện chuỗi SQL (với khả năng dấu ngoặc kép thoát), hãy thử regex: if.*?\{(\{.*?\}|[^}])*+\}

Nó sẽ khớp với một if theo sau là condition cho đến { đầu tiên, sau đó từ đó trở đi nó sẽ tiếp tục phù hợp nếu nó gặp một trong hai cái gì đó giữa một {}HOẶC bất cứ điều gì đó không phải là một }, tiếp theo là đóng cửa cuối cùng }.

Tôi đã sử dụng công cụ định lượng sở hữu để ngăn chặn khả năng xảy ra tình trạng lùi lại thảm khốc.

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