2012-11-11 30 views
7

Tôi đang tìm một regex để tìm các nhóm chụp có tên trong các chuỗi regex (khác).Regex để tìm các nhóm chụp có tên bằng ngôn ngữ lập trình Go

Ví dụ: Tôi muốn tìm (?P<country>m((a|b).+)n), (?P<city>.+)(?P<street>(5|6)\. .+) trong regex sau:

/(?P<country>m((a|b).+)n)/(?P<city>.+)/(?P<street>(5|6)\. .+) 

Tôi đã thử các regex sau đây để tìm ra nhóm bắt tên:

var subGroups string = `(\(.+\))*?` 
var prefixedSubGroups string = `.+` + subGroups 
var postfixedSubGroups string = subGroups + `.+` 
var surroundedSubGroups string = `.+` + subGroups + `.+` 
var capturingGroupNameRegex *regexp.RichRegexp = regexp.MustCompile(
    `(?U)` + 
    `\(\?P<.+>` + 
    `(` + prefixedSubGroups + `|` + postfixedSubGroups + `|` + surroundedSubGroups + `)` + 
    `\)`) 

?U làm quantifiers tham lam (+*) số lượng không tham lam và không tham lam (*?) tham lam. Chi tiết trong số Go regex documentation.

Nhưng nó không hoạt động vì dấu ngoặc đơn không khớp chính xác.

Trả lời

6

Đối sánh chính xác các dấu ngoặc đơn lồng nhau một cách chính xác là không thể với các cụm từ thông dụng bởi vì việc lồng ghép tùy ý (đệ quy) không thể được mô tả bằng ngôn ngữ thông thường.

Một số hiện đại hương vị regex làm hỗ trợ đệ quy (Perl, PCRE) hoặc phù hợp với cân bằng (NET), nhưng Go không phải là một trong số họ (the docs explicitly say rằng (?R) xây dựng Perl không được hỗ trợ bởi các RE2 library that Go's regex package appears to be based on). Bạn cần xây dựng một trình phân tích cú pháp gốc đệ quy, chứ không phải một regex.

+2

Chỉ cần làm rõ: gói "regexp" Go _không được sử dụng_ thư viện RE2. – zzzz

+1

Nó - chỉ cần theo liên kết – mvp

+0

OK, nó không thực sự sử dụng thư viện đó, nhưng nó chấp nhận cùng một cú pháp. –

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