2011-12-23 36 views
35

Tôi đã nhận thấy những điều sau đây:

var b1 = Regex.IsMatch("Line1\nLine2", "Line1$", RegexOptions.Multiline); // true 
var b2 = Regex.IsMatch("Line1\r\nLine2", "Line1$", RegexOptions.Multiline); // false 

Tôi đang bối rối. Các tài liệu của RegexOptions nói:

Multiline: chế độ Multiline. Thay đổi ý nghĩa của^và $ sao cho chúng khớp nhau ở đầu và cuối, tương ứng, của bất kỳ dòng nào, và không chỉ bắt đầu và kết thúc của toàn bộ chuỗi.

Kể từ C# và VB.NET được sử dụng chủ yếu trong thế giới Windows, tôi sẽ đoán rằng hầu hết các file xử lý bởi các ứng dụng .NET sử dụng linebreaks CRLF (\r\n) chứ không phải xuống hàng LF (\n). Tuy nhiên, có vẻ như trình phân tích cú pháp biểu thức chính quy .NET không nhận ra một dòng CRLF là một dòng của dòng.

Tôi biết rằng tôi có thể giải quyết vấn đề này, ví dụ: bằng cách kết hợp Line1\r?$, nhưng nó vẫn đánh tôi là lạ. Đây có phải là hành vi dự định của trình phân tích cú pháp regexp .NET hay tôi đã bỏ lỡ một số tùy chọn ẩn UseWindowsLinebreaks?

Trả lời

46

Từ MSDN:

Theo mặc định, phù hợp với $ chỉ cuối của chuỗi đầu vào. Nếu bạn chỉ định tùy chọn RegexOptions.Multiline, nó khớp với ký tự dòng mới (\ n) hoặc kết thúc chuỗi đầu vào. Nó không, tuy nhiên, phù hợp với sự kết hợp vận chuyển dòng/ký tự dòng thức ăn. Để kết hợp thành công, hãy sử dụng biểu thức con \ r? $ Thay vì chỉ $.

http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Multiline

Vì vậy, tôi không thể nói lý do tại sao (tương thích với các biểu thức thông thường từ các ngôn ngữ khác?), Nhưng ít nhất nó dự định.

+2

+1 Tôi thực sự không mong đợi điều đó. – stema

+2

Đáng ngạc nhiên, nhưng ít nhất cũng được xác định. Cảm ơn bạn đã đào bới điều đó! – Heinzi

+4

Điều thú vị là, nó được chấp nhận rộng rãi (và được xác định) trên các triển khai biểu thức chính quy mà $ khớp với _position_, ** không phải là _literal_. Vì vậy, đối với MSDN để nói nó phù hợp với một ký tự dòng mới không phải là hoàn toàn chính xác hoặc. – rfmodulator

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