2011-11-18 36 views
5

Tôi đang cố gắng tìm hiểu thêm về regex ngay hôm nay.Regex: làm thế nào để sử dụng lookahead/lookbehind trên kết quả của một mô hình?

Tôi chỉ đơn giản là cố gắng khớp một số đơn hàng không được bao quanh bởi dấu ngoặc đơn (#1234 nhưng không phải [#1234]) nhưng câu hỏi của tôi nói chung là sử dụng xác nhận lookahead trên mẫu tùy ý.

On nỗ lực đầu tiên của tôi, tôi nhận thấy lookahead tiêu cực của tôi trận đấu \d+(?!\]) sẽ gây ra \d+ để giữ chữ số phù hợp cho đến khi nó không được theo sau bởi một ]. Tôi cần các chữ số để chỉ khớp nếu toàn bộ số của chúng không được theo sau là ].

Giải pháp hiện tại của tôi giết trận đấu ở chữ số đầu tiên bằng cách nhìn về phía trước để xem có một số ] trong chuỗi chữ số hay không.

Đây có phải là cách tiêu chuẩn để giải quyết vấn đề này không? Tôi chỉ lặp lại mô hình phù hợp trong lookahead. Nếu đây là một regex phức tạp hơn, tôi có tiếp cận nó không? Lặp lại các trận đấu hợp lệ theo sau là trận đấu không hợp lệ và có động cơ regex lặp lại chính nó cho mỗi lá thư?

Đối với các kết quả trùng khớp hợp lệ, nó sẽ phải khớp chính xác với số lần so với các ký tự trong đối sánh.

(?<!\[) # not preceded by [ 
#\d+ 
(?!\d*\]) # not followed zero+ digits and ] 

# or (?!\d|\]) # not followed by digit or ] 

Tôi đánh giá cao mọi phản hồi!

+0

Không chắc chắn những gì bạn có ý nghĩa bởi" ... chỉ khi toàn bộ của họ không được tiếp theo a] ". Bạn có thể thêm một ví dụ về một chuỗi không nhận được kết quả phù hợp mà bạn muốn, và những gì phù hợp trong trường hợp đó? – Faust

+0

@Faust: Tôi đang nhận được trận đấu tôi muốn, tôi chỉ nghĩ rằng phương pháp của tôi không tốt. Narendra Yadala chỉ ra những gì tôi cần chính xác để ngăn chặn backtracking. Cảm ơn tất cả –

Trả lời

8

Bạn có thể đạt được những gì bạn muốn bằng cách sử dụng một lượng hóa sở hữu cùng với lookarounds như

(?<!\[)#\d++(?!\]) 

Các vấn đề này trong trường hợp của bạn là khi bạn sử dụng nó cho phép \d+ backtracking và rốt cục sẽ có một trận đấu phần #123. Một khi bạn thay đổi nó để định lượng sở hữu, nó sẽ không quay trở lại và chỉ phù hợp nếu chuỗi chữ số không phải là trước/theo sau là dấu ngoặc đơn.

Live Demo

Sửa Nếu quantifiers sở hữu không được hỗ trợ thì bạn có thể sử dụng một

#\d(?<!\[#\d)(?!\d*\])\d* 
+0

Brilliant! 'Không giống như một bộ định lượng tham lam, nó sẽ không từ bỏ các trận đấu như các bản nhạc động cơ. Với một định lượng sở hữu, thỏa thuận là tất cả hoặc không có gì. 'Đó chính xác là những gì tôi cần. Tôi rất vui vì tôi đã đặt câu hỏi:) Tôi sẽ chấp nhận ngay khi có thể. –

+0

Ouch, chỉ cần phát hiện ra python lại không hỗ trợ nó ... Có lẽ sẽ sử dụng chức năng ban đầu của tôi sau đó: ( –

+0

@YujiTomitaThêm một regex sẽ hoạt động khi số lượng sở hữu không được hỗ trợ –

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