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ứ.
+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
@polygenelubricants: Hehe, cảm ơn! =) – Jens