2010-07-14 27 views
7

Chơi xung quanh với các biểu thức chính quy, đặc biệt là sự khớp cân bằng của hương vị .NET, tôi đã đến một điểm mà tôi nhận ra rằng tôi không hiểu hoạt động bên trong của động cơ tốt như tôi nghĩ. Tôi muốn đánh giá bất kỳ đầu vào nào về lý do tại sao các mẫu của tôi hoạt động theo cách họ làm! Nhưng nắm tay ...Làm thế nào để điều kiện trong các nhóm nhìn chung hoạt động trong .NET regex?

Tuyên bố từ chối trách nhiệm: Câu hỏi này hoàn toàn là lý thuyết và mọi kết quả thu được ở đây sẽ không bao giờ được sử dụng hoặc sửa đổi và sử dụng trong mã sản xuất để phân tích cú pháp HTML. Không bao giờ. Tôi hứa. Tôi sợ ngựa. =)

Bây giờ, đến vấn đề của tôi. Tôi sẽ cố gắng để phù hợp với chữ cái A, nếu nó không phải là trước bởi một #. Để chứng minh, tôi sẽ luôn sử dụng chuỗi ..A..#..A... Ở đây, A đầu tiên phải khớp. Tất nhiên, đây là một nhiệm vụ khá dễ dàng bằng cách sử dụng "A(?<!^.*#.*)", nhưng tôi muốn sử dụng điều kiện ở đây, vì chúng có thể được sử dụng cho các trận đấu cân bằng và những thứ tuyệt vời khác.

Những gì tôi cố gắng là

"A(?<=^(#(?<q>)|[^#])*(?(q)(?!)))" 

Con đường tôi giải thích đó là: khi động cơ encounteres "A", nó đi lại cho sự bắt đầu của chuỗi, và cho mỗi nhân vật thêm một trận trống để nhóm chụp q nếu ký tự là #. Sau đó, nó sẽ thất bại nếu q chứa một trận đấu. Những gì tôi không hiểu là tại sao biểu thức này khớp với cả As trong chuỗi mẫu của tôi.

Khi tôi chỉ đơn giản là loại bỏ các lookbehind và phù hợp với toàn bộ chuỗi, công trình này:

"^(#(?<q>)|[^#])*(?(q)(?!))A" 

phù hợp với toàn bộ chuỗi lên đến A đầu tiên, ngay cả khi lượng hóa nhóm đầu tiên là tham lam. Chèn một '#' vào lúc bắt đầu cũng sẽ làm cho kết quả không thành công (như mong muốn).

Vì vậy: làm thế nào để nhìn xung quanh các nhóm, đặt tên nhóm chụp trong đó và điều kiện chơi với nhau?

Cảm ơn!

Chỉnh sửa: Sự cố này có thể được nhìn thấy dễ dàng hơn trong (?<=(?<q>)(?(q)(?!)))., không được khớp với bất kỳ ký tự nào, nhưng khớp với mọi thứ.

+0

+1 và tôi chỉ nhận được đoạn thứ hai từ trước đến nay./Được rồi, đọc toàn bộ điều, nhưng quá tệ, điều này rất C# -specific và tôi không thể đóng góp ... YET! Câu hỏi được ưa thích và được đánh dấu! – polygenelubricants

+0

@polygenelubricants: Hehe, cảm ơn! =) – Jens

Trả lời

3

Điều kiện không thực sự hữu ích trong kết hợp cân bằng - hoặc bất kỳ nơi nào khác, cho vấn đề đó. ;) Công cụ so khớp cân bằng hoạt động bằng cách sử dụng nhóm chụp được đặt tên làm ngăn xếp; mỗi lần nhóm đó khớp với nội dung nào đó, văn bản phù hợp được đẩy lên ngăn xếp. Ngoài ra còn có cú pháp đặc biệt cho popping stack. Dưới đây là phần giới thiệu tốt:

http://blog.stevenlevithan.com/archives/balancing-groups

+0

Tôi thực sự phải đối mặt với vấn đề này khi cố gắng sử dụng kết hợp cân bằng trước tiên. Kỹ thuật này dường như thất bại khi được sử dụng trong một lookbehind, và tôi không có đầu mối tại sao. Câu hỏi này là trường hợp đơn giản nhất có thể gặp sự cố tương tự. – Jens

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