2015-05-18 16 views
8

Vì tôi hơi mới với re2, tôi đang cố gắng tìm cách sử dụng tích cực-lookahead (?=regex) như JS, C++ hoặc bất kỳ kiểu PCRE nào trong Go.Sử dụng tích cực-lookahead (? = Regex) với re2

Dưới đây là một số ví dụ về những gì tôi đang tìm kiếm.

JS:

'foo bar baz'.match(/^[\s\S]+?(?=baz|$)/); 

Python:

re.match('^[\s\S]+?(?=baz|$)', 'foo bar baz') 
  • Lưu ý: cả hai ví dụ phù hợp 'foo bar '

Thanks a lot.

+5

Nhìn vào https://github.com/google/re2/wiki/Syntax - có một dòng ghi "' (? = Re) 'trước khi khớp với văn bản' re' (KHÔNG ĐƯỢC H SUP TRỢ) ". Điều này không tốt. Ngoài ra, nó còn nói "thay thế cho các công cụ biểu thức chính quy ngược dòng" - cho thấy chúng sẽ giảm một số tính năng. – Kobi

+0

Tôi đoán đó là một câu trả lời, vì vậy tôi đã thêm một câu trả lời. – Kobi

+1

@Kobi hiện có [dlclark/regexp2] (https://github.com/dlclark/regexp2) có sẵn – Andy

Trả lời

5

Bạn có thể đạt được điều này với một regexp đơn giản:

re := regexp.MustCompile(`^(.+?)(?:baz)?$`) 
sm := re.FindStringSubmatch("foo bar baz") 
fmt.Printf("%q\n", sm) 

sm[1] sẽ là trận đấu của bạn. Sân chơi: http://play.golang.org/p/Vyah7cfBlH

+0

Có, nhóm chụp là phương tiện duy nhất để đạt được điều đó ... ít nhất, cho đến khi các giao diện được triển khai trong Go, –

+0

Vâng, tôi cũng đang sử dụng giải pháp này. thx – a8m

+4

@stribizhev (wrt của bạn "cho đến khi nhìn-aheads được thực hiện trong Go" bình luận), tôi nghi ngờ các tính năng như vậy sẽ bao giờ được thêm vào Go hoặc Go sẽ chuyển từ sử dụng RE2. (Mặc dù bạn có thể sử dụng gói PCRE của bên thứ ba, nhưng tôi sẽ không khuyên bạn sử dụng). Hầu hết/tất cả các tính năng này không được hỗ trợ do thiết kế cơ bản là sự lựa chọn có chủ ý giữa các tính năng "nâng cao" (nhưng chậm/nguy hiểm) và tốc độ và độ an toàn (về thời gian chạy/bộ nhớ). Xem https://swtch.com/~rsc/regexp/regexp1.html để biết chi tiết (hoặc chỉ nhìn vào biểu đồ). –

11

Theo Syntax Documentation, tính năng này không được hỗ trợ:

(?=re) trước khi văn bản phù hợp với re (không được hỗ trợ)

Ngoài ra, từ WhyRE2:

Là một vấn đề về nguyên tắc, RE2 không hỗ trợ các cấu trúc mà chỉ có các giải pháp backtracking ar e được biết là tồn tại. Do đó, các xác nhận ngược lại và xác nhận xung quanh không được hỗ trợ.

+0

Tôi nên chú ý đến Wiki hơn :). cám ơn. – a8m

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