مدیریت هوشمندانه خطوط جدید در regular expressions داتنت ۱۱
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۴/۲۵ ۰۹:۲۵
آدرس: www.dntips.ir
RegexOptions.AnyNewLine، این گره کور را باز کردهاست. در این مقاله، به بررسی این چالش قدیمی، مشکلات راهکارهای سنتی و نحوه حل اصولی آن در داتنت ۱۱ میپردازیم.\r\n (CRLF)\n (LF)\r (CR)\u0085 - NEL)\u2028 - LS)\u2029 - PS)var text = "The Quick\r\nBrown Fox\u0085Jumped Over\u2028The Lazy Dog\nBigly";
using System;
using System.Linq;
using System.Text.RegularExpressions;
var oldLines = Regex.Matches(text, @"^.*$", RegexOptions.Multiline)
.Select(r => r.Value)
.ToArray();^ نشاندهنده ابتدای خط است..* هر کاراکتری به جز \n را به تعداد دلخواه جستجو میکند.$ نشاندهنده انتهای خط است.RegexOptions.Multiline به موتور پردازش اعلام میکند که متن ورودی ساختار چندخطی دارد.\n (LF) را به عنوان جداکننده خط در حالت Multiline میشناسد. در نتیجه اجرای کد بالا روی متن نمونه، خروجی مطلوبی نخواهد داشت:\u0085 یا \u2028 اصلاً شناسایی نمیشوند و خطوط متصل به آنها جدا نخواهند شد.\r\n)، از آنجا که فقط \n به عنوان پایان خط در نظر گرفته میشود، کاراکتر \r (Carriage Return) به عنوان بخشی از متن خط اول (پایان آن) استخراج میشود که نیاز به پاکسازی مجدد (مانند Trim کردن) دارد.RegexOptions.AnyNewLineRegexOptions.AnyNewLine را به کلاس Regex اضافه کرده است. با فعالسازی این گزینه، لنگرهای سر خط (^)، ته خط ($)، پایان رشته (\Z) و همچنین کاراکتر نقطه (.) به صورت هوشمند تمامی استانداردهای خط جدید (اعم از ویندوز، لینوکس و انواع یونیکدها) را به رسمیت میشناسند.using System;
using System.Linq;
using System.Text.RegularExpressions;
var text = "The Quick\r\nBrown Fox\u0085Jumped Over\u2028The Lazy Dog\nBigly";
// استفاده همزمان از حالت چندخطی و پرچم جدید AnyNewLine
var newLines = Regex.Matches(text, @"^.*$", RegexOptions.Multiline | RegexOptions.AnyNewLine)
.Select(r => r.Value)
.ToArray();
foreach (var line in newLines)
{
Console.WriteLine($"Line: {line}");
}\r\n: برخلاف ترفندهای قدیمی (مانند استفاده از \r?$) که کاراکتر \r را به عنوان بخشی از تطابق (Match) برمیگرداندند، گزینه AnyNewLine با ترکیب \r\n به عنوان یک موجودیت واحد و اتمیک برخورد کرده و از ورود کاراکتر مزاحم \r به خروجی نهایی جلوگیری میکند.RegexOptions.AnyNewLine در داتنت ۱۱ گام مهمی در جهت بهبود پایداری و سادگی پردازش متون چندزبانه و بینالمللی است. با بکارگیری این پرچم، دیگر نیازی به نوشتن متدهای کمکیِ سنگین برای نرمالسازی خطوط پیش از اعمال Regex یا استفاده از پترنهای پیچیده و غیراستاندارد نخواهید داشت. کد شما خواناتر، سریعتر و به شدت در برابر انواع فرمتهای متنی مقاومتر خواهد بود.