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
?
+1 Tôi thực sự không mong đợi điều đó. – stema
Đá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
Đ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