ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل بیستم دستکاری متن در #C

<!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627400839 -2147483648 8 0 66047 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman";} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} .MsoPapDefault {mso-style-type:export-only; margin-bottom:10.0pt; line-height:115%;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 72.0pt 72.0pt 72.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

فصل بیستم

C # دستکاری متن در

آنچه که در این فصل یاد خواهید گرفت:

یک کاراکتر را به صورت یک کاراکتر یونیکد 16 بیتی ذخیره می کند. .NET ، کاراکترها و یونیکد 1: به طور پی شفرض 􀂃

این عمل برنام ههای کاربردی را برای پشتیبانی مجموعه کاراکترهای بین المللی پشتیبانی می کند. این تکنیک با

عنوان محلی کردن 2 بیان م یشود.

رشته ها تغییرناپذیر هستند. برای کاربرد مؤثر رشت هها، فهم معنی آنها و اینکه چگونه .NET در :String مروری بر 􀂃

تغییرناپذیری، عملیات رشته ها را تحت تأثیر قرار می دهد، ضروری است.

تکنیک های فرمت دهی اعداد و تاریخ را پشتیبانی می کند. .NET ، علاوه بر عملیات پای های رشته :String عملیات 􀂃

این کلاس یک روش مؤثر برای الحاق رشت هها فراهم می سازد. :StringBuilder 􀂃

یک موتور برای پارس کردن، تطابق و استخراج مقادیر از یک رشته بکار ،.NET در Regex عبارات منظم: کلاس 􀂃

می برد.

را معرفی می کند. موضوعات این فصل شامل کاربرد متدهای .NET این فصل توانای یهای اداره کردن رشته بوسیلة کلا سهای

اعداد و تاری خها را در String.Format جهت استخراج و دستکاری محتوای رشته است. کاربرد متد String پایه

فرمت های خاص نشان می دهد و کاربرد عبارت های منظم جهت انجام تطابق الگوی پیشرفته است. این فصل نحوه ی

را در بر دارد و غیره. JIT بهینه سازی کاربرد رشته های حرفی در کامپایلر

-1-20 کاراکترها و یونیکد

یکی از رویدادهای مهم در محاسبات، معرفی مجموعه کاراکتر هفت بیتی اسکی به عنوان شمای کدگذاری استاندارد جهت

تعیین منحصر به فرد کاراکترهای الفبایی و سمبل های مشترک دیگر است. آن بر اساس الفبای لاتین بوده و 128 کاراکتر را

تعداد کاراکترها را دو برابر کرده و سمب لهای واحد پول و الفبای اروپایی را به آن اضافه کرد. ANSI شامل است. استاندارد

چون آن بر اساس کاراکترهای لاتین است، تعدادی شمای کدگذاری برای نمایش کاراکترهای غیر لاتین همچون عربی، فارسی

و یونانی ایجاد شده است.

1 Unicode

2 Localization

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

334

ائتلاف بین المللی به دلیل نیاز به یک شمای کدگذاری جهانی، مشخصه ی یونیکد را پیشنهاد دادند. در حال حاضر آن یک

نوع برنامه و نوع زبان ، PlatForm استاندارد جهانی است که برای هر کاراکتر یک عدد منحصر به فرد تعریف می کند. نوع

مهم نیست.

-1-1-20 یونیکد

به طور کامل استاندارد یونیکد را پشتیبانی می کند. نمایش داخلی یک کاراکتر، یک عدد صحیح بدون علامت 16 بیتی .NET

است، که شمای کدگذاری یونیکد را پیروی می کند. یک کاراکتر دو بایتی می تواند 65535 مقدار مختلف ارائه دهد. شکل

1-20 نشان می دهد چرا دو بایت نیاز است.

1- شکل 20

کاراکتر حرف بزرگ سمت چپ، یک عضو از مجموعه کاراکتر پایه لاتین است که 128 کاراکتر اسکی اصلی را در بر م یگیرد.

مقدار دهدهی 75 می تواند در یک بایت قرار گیرد. بیت های بی نیاز صفر قرار داده می شوند. با این وجود سه کاراکتر بعدی

مقادیری در محدودة 310 تا 56609 دارند که حداقل به دو بایت حافظه نیاز دارند.

کاراکترهای یونیکد یک مشخصه ی منحصر به فرد متشکل از یک نام و مقدار دارند. نسخه جاری یونیکد 96382 کاراکتر

تعریف می کند. این کاراکترها در بیشتر از 130 مجموعه کاراکتر گروه بندی شد هاند، که حروف الفبای زبا نها، سمب لهای

اشکال جغرافیایی، الفباء نابینایان و کاربردهای دیگر را شامل هستند. ،OCR ، ریاضی، موزیک

چون 16 بیت نمی تواند 100000 کاراکتر جهانی را پشتیبانی کنند، برای بعضی از مجموعه کاراکترها بایتهای بیشتری مورد نیاز

است. راه حل یونیکد، مکانیزم تعریف یک کاراکتر با دو مجموعة 16 بیتی است. این زوج کد، یک زوج جانشین 1نامیده

می شوند. جانشین بالا و پایین یک کاراکتر انتزاعی 32 بیتی را به یک 16 بیتی نگاشت می کنند. این روش بیش از 100000

کاراکتر را پشتیبانی می کند. جانشین ها از مقادیری که در فضای بالای یونیکد هستند، ساخته می شوند و با کاراکترهای

واقعی اشتباه نم یشوند.

.NET و کلا سهای API به عنوان یک توسعه دهنده، می توانید جزئیات کاراکترهای 16 یا 32 بیتی را در نظر نگیرند، چون

جزئیات اصلی نمایش کاراکترهای یونیکد را اداره می کنند. اما زمانیکه می خواهید یک رشته را به صورت بایت به بایت در یک

یک شی خاص برای طی کردن بایت ها فراهم می کند. .NET ، جریان بنویسید. تشخیص جانشین ها ضروری است. بدین منظور

نکته: اگر کامپیوتر شما یک فونت برای پشتیبانی کاراکترهای یونیکد را داشته باشد، م یتواند آنها را نمایش دهید. در

یک فونت مربوط به یونیکد را نصب کنید. برنام ههای کنسولی ttfext.exe سیستم عامل ویندوز م یتوانید با استفاده از

نم یتوانند کاراکترهای یونیکد را چاپ کنند، چون خروجی کنسول همواره در یک سبک حروف نامتناسب نمایش داده

م یشود.

1 Surrogate

#C فصل بیستم دستکاری متن دز

335

-2-1-20 کار با کاراکترها

تعداد کمی عضو char نمایش داده می شود. ساختار Char یا کلاس char یک کاراکتر واحد به صورت یک ساختار .NET در

برای تبدیل کردن و بازرسی مقدار آنها تعریف می کند. اکنون مروری گذرا بر بعضی از عملیات استاندارد کاراکتر داریم.

char انتساب یک مقدار به یک نوع داده ی

در char با یک مقدار حرفی است. با این وجود، چون یک مقدار ،char واضح ترین روش انتساب یک مقدار به یک متغیر

درون به صورت یک عدد نمایش داده م یشود، می توانید یک مقدار عددی نیز به آن انتساب دهید. اینها مثال هایی هستند.

string klm = "KLM";

byte b = 75;

char k;

// Different ways to assign 'K' to variable K

k = 'K';

k = klm[0]; // Assign "K" from first value in klm

k = (char) 75; // Cast decimal

k = (char) b; // cast byte

k = Convert.ToChar(75); // Converts value to a char

به یک مقدار عددی Char تبدیل یک مقدار

زمانی که یک کاراکتر به یک عدد تبدیل می شود، نتیجه ی آن مقدار یونیکد کاراکتر است. قال ب بندی، مؤثرترین روش انجام

یک رقم می باشد و شما می خواهید char می تواند به کار برده شود. در حالت خاصی که Convert این کار است، اگرچه متد

استفاده کنید. GetNumericValve یک مقدار وابسته به زبان شناسی 1 انتساب دهید، می توانید از متد ایستایی

// '7' has Unicode value of 55

char k = '7';

int n = (int) k; // n = 55

n = (int) char.GetNumericValue(k); // n = 7

-3-1-20 کاراکترها و محلی کردن

توانایی تشخیص اتوماتیک و اعمال قوانین فرهنگ خاص یک زبان یا یک کشور به یک ،.NET یکی از مهمترین ویژگیهای

برنامه ی کاربردی است. این پروسه به محلی کردن معروف است، که نحوه ی فرمت دهی اعداد، تاریخ، نمایش سمب لهای واحد

پول یا انجام عملیات مقایسه ی رشته ها را مشخص می کند. در مواقع عملی، محلی کردن بدین معنی است که یک برنامه به

CLR . 2004 نشان می دهد /9/ 9 نشان می دهد و در تگزاس به صورت 5 May یک کاربر در پاریس تاریخ را به صورت 2004 و

به طور اتوماتیک فرهنگ کامپیوتر محلی را تشخیص داده و تنظی مها را انجام می دهد.

جهت معین کردن زبان/ کشور CultureInfo بیش از یکصد نام و مشخصه فرهنگ فراهم می کند که کلاس .NET چارچوب

استفاده می شود تا در عملیات حساس به فرهنگ در یک برنامه بکار برده شود. اگرچه در زمان کار با رشته ها، محلی کردن اثر

یک روش مفید برای نمایش این مفهوم است. Char.ToUpper بیشتری دارد، در این مثال متد

// Include the System.Globalization namespace

// Using CultureInfo – Azerbaijan

char i = 'i';

// Second parameter is false to use default culture settings

// associated with selected culture

CultureInfo myCI = new CultureInfo("az", false );

i = Char.ToUpper(i,myCI);

1 Linguistic

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

336

برای تعیین فزهنگ می گیرد، که در اجرای متد استفاده CultureInfo یک شی ToUpper از متد OverLoad یک

را می بیند، آن CultureInfo پارامتر CLR اختصار زبان آذری کشور آذربایجان است. زمانی که az ، می شود. در این مثال

هر جنبه از فرهنگ که ممکن است عملیات را تحت تأثیر قرار دهد، در نظر می گیرد. زمانی که هیچ پارامتری فراهم نشود،

فرهنگ پیش فرض سیستم را در نظر می گیرد. CLR

اطلاعات فرهنگ پیش فرض را از تنظیمات کشور و فرهنگ سیستم بدست می آورد. .NET در سیستم عامل ویندوز، چارچوب

انتساب می دهد. می توانید این گزینه را Thread.CurrentThread.CurrentCulture آن این مقادیر را به خصوصیت

انتخاب کنید. Control Panel در Regional Options با استفاده از

چرا آذربایجان یک کشور کوچک بالای دریای خزر را برای ارائه محلی کردن انتخاب کردیم؟ بین همه کشورهای دنیا که

0049 ) نشان نمی دهند. بلکه با یک I(U+ را با i مجموعه کاراکتر لاتین را به کار می برند، فقط آذربایجان و ترکیه حرف بزرگ

این عمل را درست انجام ()ToUpper 0130 ) نشان می دهند. برای اطمینان از اینکه متد U+) که در بالای آن یک نقطه است I

ایجاد کرده و به متد مورد نظر رد کنیم. این (az) با نام و فرهنگ آذری CultureInfo می دهد، ما باید یک نمونه از کلاس

عمل کاراکتر یونیکد را درست نتیجه م یدهد و 8,3 میلیون آذربایجانی را راضی نگه می دارد.

-4-1-20 کاراکترها و دسته های یونیکد آنها

را UnicodeCategory یک نوع شمارشی .NET . استاندارد یونیکد، کاراکترها را به یکی از 30 دسته تقسیم بندی می کند

دسته ی کاراکتر را بر م یگرداند. در اینجا ()Char.GetUnicodeCategory برای نمایش این دست هها فراهم می کند و متد

یک مثال آمده است:

Char k = 'K';

int iCat = (int) char.GetUnicodeCategory(k); // 0

Console.WriteLine(char.GetUnicodeCategory(k)); // UppercaseLetter

char cr = (Char)13;

iCat = (int) char.GetUnicodeCategory(cr); // 14

Console.WriteLine(char.GetUnicodeCategory(cr)); // Control

Control معین می کند و کاراکتر برگشت را به صورت یک UpperCaseLetter را به طور صحیح به عنوان یک K این متد

یک مجموعه از متدهای ایستا را به صورت یک میانبر برای تعیین دسته ی یونیکد کاراکتر دارد. آنها بر char . بر می گرداند

1 این متدها را لیست - بر می گردانند. جدول 20 true یا false یک مقدار GetUnicodeCategory اساس فراخوانی

می کند.

5- جدول 1

متد دسته یونیکد توصیف

IsControl

یا F007U+ 4 کد این کاراکترها

یا F001U+ 000 تا U+ در محدود هی

است. U+009F تا U+0080

IsDigit 8 در محدود هی 0 تا 9

IsLetter 0،1،2،4 حروف

IsLetterorDigit 0،1،8 اجتماع حروف و ارقام

IsLower 1 حروف کوچک

#C فصل بیستم دستکاری متن دز

337

IsUpper 0 حروف بزرگ

IsPunctuation

,22 ,21 ,20 ,19 ,18

24 ,23

سمبل تأکید مثال

DashPunctuation(19)

OpenPunctuation(20),

OtherPunctuation(24).

IsSeparator 11،12،13 جدا کننده فاصله، جداکننده خط،

جدا کننده پاراگراف

IsSurrogate 16 مقدار آن یک جانشین بالا یا پایین است.

IsSymbol 25،26،28 سمبل

IsWhiteSpace 11 فضاهای خالی م ی توانند هر کدام یک از

20X این کاراکترها باشند. 0

کاراکتر برگشت) ) D0X (فضای خالی) 0

خط جدید) ) A0X افقی) 0 (tab 09X0

عمودی) B (tab0X فرم جدید) 0 ) C0X0

دارند که یکی از آنها یک کاراکتر واحد را به OverLoad کاربرد این متدها سر راست است. نکته ی جالب اینکه، آنها دو تا

عنوان پارامتر می گیرد و دیگری دو پارامتر یکی رشته و دیگری اندیس کاراکتر را می گیرد.

Console.WriteLine(Char.IsSymbol('+')); // true

Console.WriteLine(Char.IsPunctuation('+')): // false

string str = "black magic";

Console.WriteLine(Char.IsWhiteSpace(str, 5)); // true

char p = '.';

Console.WriteLine(Char.IsPunctuation(p)); // true

Int iCat = (int) char.GetUnicodeCategory(p); // 24

Char p = '(';

Console.WriteLine(Char.IsPunctuation(p)); // true

int iCat = (int) char.GetUnicodeCategory(p); // 20

-2-20 کلاس رشته

کلاس رشته قبلاً استفاده شده است. این فصل نگاهی دقیق روی ایجاد، مقایسه و فرم تدهی رشته ها دارد.

-1-2-20 ایجاد رشت هها

و انتساب یک مقدار به آن ایجاد می شود. مقدار موردنظر ممکن است یک string یک رشته با اعلان یک متغیر از نوع

رشته ی حرفی یا رشت هی ایجاد شده با عمل الحاق باشد. این یک پروسه ی سرسری است و اغلب برنام هنویسان در زمان بهبود

یک فهم از نحوه ی اداره کردن رشت ههای حرفی م یتواند در بهبود کارایی آن به .NET کارایی کد به آن توجهی ندارند. در

توسعه دهنده کمک کند.

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

338

-2-2-20 داخل کردن 1 رشته ها

قبلاً در مورد نحوة ذخیر هی انواع داد ه مقداری و ارجاعی در حافظه بحث شده است. بیاد دارید که انواع داد هی مقداری روی

CLR مدیریت شده جای می گیرند. همچنین Heap ذخیره می شوند. در حالیکه انواع داده ی ارجاعی روی یک Stack یک

یک ناحیه ی سومی در حافظه به نام استخر داخلی 2 کنار می گذارد که در طول کامپایل، همه رشته های حرفی در آن ذخیره

می شوند. با استفاده از این استخر تکثیر کپی مقادیر رشت های ذخیره شده حذف می گردد. کد زیر را بررسی کنید.

string poem1 = "Kubla Khan";

string poem2 = "Kubla Khan";

string poem3 = String.Copy(poem2); // Create new string object

string poem4 = "Christabel";

2 یک دید ساده از نحو هی ذخیره رشته ها و مقادیر آنها در حافظه را نشان می دهد. - شکل 20

2- شکل 20

رشته ی مورد نظر است و اشاره گر آن به ،hash پیاده سازی می شود. کلید جدول hash استخر داخلی به صورت یک جدول

کد قبلی را کامپایل می کند، ،JIT مدیریت شده ارجاع می کند. زمانی که کامپایلر heap شی رشت هی انتساب یافته در روی

مدیریت شده ایجاد heap را در استخر قرار می دهد و یک ارجاع به شی رشته در روی ”Kubla Khan“ آن اولین نمونه از

می بیند این رشته در حافظه وجود CLR ، 2) روبرو می شود Kubla Khan” (poem“ می کند. زمانی که آن با ارجاع دوم به

1) ارجاع می دهد. این پروسه به داخل poem) 2 را به همان شی poem ، دارد، بدین دلیل به جای ایجاد یک رشت هی جدید

3 ایجاد می کند. در روی Poem یک رشته ی جدید به نام String.Copy کردن رشته ها معروف است. در ادامه ی مثال، متد

4 به استخر اضافه poem مدیریت شده یک شی برای آن ایجاد می کند. سرانجام، رشته ی حرفی انتساب داده شده به heap

می شود.

برای بررسی اثرات عملی داخل کردن رشته، اجازه دهید مثال قبلی را توسعه دهیم. کدی اضافه می کنیم که عملگر تساوی

را برای مقایسه آدرس آنها اضافه Object.ReferenceEqual (==) را برای مقایسه مقادیر رشته ای به کار می برد و متد

می کند.

Console.WriteLine(poem1 == poem2); // true

Console.WriteLine(poem1 == poem3); // true

Console.WriteLine(ReferenceEquals(poem1, poem3)); // false

Console.WriteLine(ReferenceEquals(poem1,

"Kubla Khan")); // true

1 Interning

2 Intern Pool

#C فصل بیستم دستکاری متن دز

339

بر می گردانند. دستور سوم موقعیت حافظ هی متغیرهای true دو دستور اول مقدار متغیرها را مقایسه می کنند و یک مقدار

برگردانده می شود. false ارجاع دارند مقدار heap 2 را مقایسه می کند. چون آنها به اشیاء مختلفی در روی poem 3 و poem

تصمیم گرفتند مقادیر پویای ایجاد شده را از استخر خارج کنند. چون بررسی استخر داخلی در زمان ایجاد هر .NET طراحان

برای اضافه کردن یک رشته ی پویا به استخر حرفی String.Intern رشته، روی کارایی اثر منفی دارد. با این وجود، متد

استفاده می شود.

string khan = " Khan";

string poem5 = "Kubla" + khan;

Console.WriteLine(ReferenceEquals(poem5, poem1)); // false

// Place the contents of poem5 in the intern pool—if not there

poem5 = String.Intern(poem5);

Console.WriteLine(ReferenceEquals(poem5, poem1)); // true

را در استخر داخلی جستجو م یکند. چون آن رشته در استخر (”(“Kubla Khan 5poem مقدار String.Intern متد

5 انتساب می دهد. چون poem وجود دارد، نیازی نیست اضافه گردد. متد یک ارجاع به ش ی موجود بر می گرداند و آن را به

است. توجه داشته باشید که true 1 به شی یکسانی اشاره می کنند، عمل مقایسه در دستور آخری مقدار poem 5 و poem

بعدی جاروب می شود. GC 5 آزاد می شود و در حین poem شی ایجاد شده برای

برای استفاده از مزیت مقایسه بوسیله ارجاع، فقط در صورتی که رشته در چندین عمل مقایسه حضور داشته باشد، متد

را بکار برید. String.Intern

-3-2-20 مروری بر عملیات رشته ها

دارند. این OverLoad تعداد زیادی متد ایستا و نمونه فراهم می کند، که بیشتر آنها چندین شکل System.String کلاس

متدها بر اساس عملکرد اصلی آنها به 4 دسته اصلی گرو هبندی می شوند.

روش های مختلفی برای String.CompareOrdinal و String.Equals ،String.Compare مقایسه رشته: متدهای

مقایسه ی مقادیر رشته ای پیشنهاد می کنند. انتخاب یک روش به نوع مقایسه (ترتیبی یا حرفی) وابسته است و اینکه آیا

حالت و فرهنگ عمل را در نظر بگیرد یا نه.

اندیس گذاری و جستجو: یک رشته آرایه ای از کاراکترهای یونیکد است که با ط یکردن سراسر آرایه یا با استفاده از متدهای

اندیس خاص م یتوان مقادیر رشته ای را تعیین محل کرد.

تبدیل رشته ها: این دسته از عملیات شامل درج، پیمایش، حذف، جایگذاری، حذف فضاهای خالی و جدا کردن رشته های

کاراکتری است.

بیشتر متدهای رشته به فرهنگ وابسته هستند. هر جا که لازم باشد، نحوه تأثیر فرهنگ روی رفتار یک متد را نشان خواهیم

داد.

-3-20 مقایسه ی رشت هها

ساده ترین راه تعیین مساوی بودن دو رشته این است که ببینیم آیا آنها به آدرس حافظه یکسانی اشاره می کنند. ما این کار را

انجام می دهیم. اگر دو رشته آدرس یکسانی را به اشتراک نگذارند، مقایسه کاراکتر ReferenceEquals با استفاده از متد

به کاراکتر برای تعیین مساوی بودن آنها لازم است. این عمل بیشتر از قبلی طول می کشد، ولی نمی توان از آن چشم پوشی

کرد.

را فراهم کرد که هر دو نوع عمل مقایسه را به طور اتوماتیک انجام Equals برای بهینه کردن پروسه ی مقایسه، متد .NET

می دهد. می توانیم عمل آن را در شبه کد زیر شرح دهیم.

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

340

If string1 and string2 reference the same memory location

Then strings must be equal

Else

Compare strings character by character to determine equality

را نشان می دهد. Equals این قطعه کد شک لهای ایستا و ارجاع متد

string poem1 = "Kubla Khan";

string poem2 = "Kubla Khan";

string poem3 = String.Copy(poem2);

string poem4 = "kubla khan";

//

Console.WriteLine(String.Equals(poem1,poem2)); // true

Console.WriteLine(poem1.Equals(poem3)); // true

Console.WriteLine(poem1 == poem3); // equivalent to Equals

Console.WriteLine(poem1 == poem4); // false – case differs

را فراخوانی می کند.) روش مطلوب تر بیان عمل مقایسه است. اگرچه متد Equals توجه کنید که عملگر==، (که متد

ی برای گرفتن فرهنگ حساب کاربری و حساسیت OverLoad بیشتر نیازهای مقایسه را برآورده می سازد، آن هیچ Equals

این محدودیت ها را رفع می کند. String کلاس Compare حروف را ندارد. متد

String.Compare -1-3-20 کاربرد

یک متد انعطاف پذیر در عمل مقایسه است که می تواند با در نظر گرفتن فرهنگ و حالت حروف بکار String.Compare

های زیادی برای گرفتن پارامترهای فرهنگ و حالت حروف دارد. OverLoad برده شود. آن

گرامر:

int Compare (string str1, string str2)

Compare (string str1, string str2, bool IgnoreCase)

Compare (string str1, string str2, bool IgnoreCase,

CultureInfo ci)

Compare (string str1, int index1, string str2, int index2,

int len)

پارامترها

رشته های مورد نظر جهت عمل مقایسه. : Str2, Str1

است. false باشد. به طور پی شفرض true برای در نظر نگرفتن حساسیت حروف باید :IgnoreCase

Str و 2 Str محل شروع در 1 :index1, index2

که فرهنگ مورد استفاده را نشان می دهد. CultureInfo یک شی :C2

یک مقدار صحیح بر می گرداند که نتیجه ی مقایسه را نشان می دهد. اگر دو رشته مساوی باشند، یک مقدار ()Compare متد

صفر برگردانده می شود. اگر رشته ی اول کوچکتر از رشته ی دوم باشد، یک مقدار منفی برگردانده می شود. اگر رشته اول

بزرگتر از رشته ی دوم باشد، یک مقدار مثبت برگردانده م یشود.

را برای در نظر گرفتن فرهنگ و حساسیت حروف نشان می دهد. Compare قطعه کد زیر نحو هی استفاده از دستور

int result;

string stringUpper = "AUTUMN";

string stringLower = "autumn";

// (1) Lexical comparison: "A" is greater than "a"

result = string.Compare(stringUpper,stringLower); // 1

// (2) IgnoreCase set to false

result = string.Compare(stringUpper,stringLower,false); // 1

// (3)Perform case-insensitive comparison

result = string.Compare(stringUpper,stringLower,true); // 0

#C فصل بیستم دستکاری متن دز

341

لیستی از قوانین مقایسه برای هر .NET . شاید اثر نهایی اطلاعات فرهنگ روی عمل مقایسه مهمتر از حالت حروف باشد

فرهنگ اختصاص داده شده را بررسی می کند و قوانین آن را اعمال CLR ، اجرا م یشود Compare فرهنگ دارد. زمانی که متد

یا یک فرهنگ ژاپنی به طور مختلف مقایسه US می کند. نتیجه اینکه، ممکن است دو رشته روی یک کامپیوتر با فرهنگ

شوند. این حالت ها زمانی مهم است که بخواهید فرهنگ جاری، بقیه فرهنگ ها را باطل کند تا همه کاربران از رفتار یکسان

برنامه مطمئن شوند. برای مثال، بسیار مهم است که یک عمل مرت بسازی در هر جایی که اجرا م یشود، درست و دقیق اجرا

گردد.

اطلاعات فرهنگ را بر اساس مقدار خصوصیت Compare به طور پیش فرض متد

بکار می برد. برای باطل کردن مقدار پیش فرض، یک ش ی Thread.CurrentThread.CurrentCulture

نشان Germany به عنوان پارامتر متد تهیه کنید. دستور زیر نحوه ی ایجاد یک شی برای ارائه زبان و کشور CultureInfo

می دهد.

CultureInfo ci = new CultureInfo("de-DE"); // German culture

دو خصوصیت دارد که به عنوان پارامتر CultureInfo برای تعیین صریح یک فرهنگ پی شفرض یا هیچ فرهنگی، کلاس

InvariantCulture برای استفاده کردن فرهنگ ریسمان جاری استفاده م یشود و CurrentCulture : می تواند بگیرد

که از هر فرهنگی چشم پوشی می کند.

را نشان می دهد. ()Compare مثل زیر نحوه تأثیر فرهن گهای مختلف روی نتیج هی عمل

using System.Globalization; // Required for CultureInfo

// Perform case-sensitive comparison for Czech culture

string s1 = "circle";

string s2 = "chair";

result = string.Compare(s1, s2,

true, CultureInfo.CurrentCulture)); // 1

result = string.Compare(s1, s2,

true, CultureInfo.InvariantCulture)); // 1

// Use the Czech culture

result = string.Compare(s1, s2,

true, new CultureInfo("cs-CZ")); // -1

هیچ فرهنگی و فرهنگ چکوسلواکی ،US با استفاده از سه حالت فرهنگ ”Chair” , “Circle“ دو مقدار رشته ای

مقایسه می شوند. دو مقایس هی اول مقدار مثبت بر م یگردانند، در حالی که در فرهنگ چکوسلواکی مقدار منفی بر می گرداند.

ظاهر می گردد. C به صورت یک کاراکتر تکی در نظر گرفته می شود که بعد از کاراکتر ”Ch“ چون در قوانین زبان چکوسلواکی

CultureInfo در صورتی که می خواهید یک برنامه ای بنویسید که اطلاعات فرهنگ کاربر جاری را بکار برد، یک پارامتر

صریح بکار برید تا در عملیات رشت های مشکلی پیش نیاید.

String.CompareOrdinal -2-3-20 کاربرد

را بکار برید. آن String.CompareOrdinal . اگر می خواهید یک مقایسه براساس مقدار ترتیبی کاراکترها انجام دهید

یک الگوریتم ساده برای مقایسه مقدار یونیکد در رشته بکار می برد. اگر دو رشته مساوی باشند، مقدار صفر بر می گرداند. در

صورتی که رشته ی اول بزرگتر از رشته دوم باشد، مقدار کوچکتر از صفر بر می گرداند، در غیر اینصورت مقدار بزرگتر از صفر

را نشان م یدهد. CompareOrdinal و Compare بر می گرداند. کد زیر تفاوت مابین

string stringUpper = "AUTUMN";

string stringLower = "autumn";

//

result = string.Compare(stringUpper,stringLower,

false, CultureInfo.InvariantCulture); // 1

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

342

result = string.CompareOrdinal(stringUpper,stringLower); // -32

یک مقایسه ی حرفی انجام می دهد که رشته حروف بزرگ از رشته حروف کوچک، بزرگتر است. Compare متد

کمتر است، رشته اول کوچکتر از ()a0061U+ 0041 ) از A(U+ مقادیر یونیکد را بررسی می کند. چون CompareOrdinal

دومی است.

-4-20 جستجو، تغییر و کدگذاری محتوای یک رشته

را شرح می دهد که نسبت به کارهای آشنا همچون محل یابی یک ریز رشته در رشته، تغییر String این بخش متدهایی از

حالت حروف یک رشته و جایگذاری و حذف زیر رشته و غیره متفاوت عمل می کنند.

-1-4-20 جستجوی محتویات یک رشته

موقعیت یک n می تواند جستجو شود، که ([String[n) رشته یک آرای های از کاراکترها است و با استفاده از گرامر آرایه

متدهای String کاراکتر در رشته است. برای محل یابی یک زیررشته ی یک یا چند کاراکتری در یک رشته، کلاس

2 این متدها را خلاصه می کند. - را پیشنهاد می کند. جدول 20 IndexOfAny و IndexOf

2- جدول 20

عضو توصیف

از رشته را فهرست م یکند. n یک کاراکتر 16 بیتی قرار گرفته در موقعیت [n]

;Int ndx=0

(While (ndx<poem.length

}

;([Console. Write (Poem[ndx

;1Ndx+=

{

IndexOf /LastIndexOf

String, [int stat, )

([[int count

تعداد کاراکترهای Cont

مورد بررسی است.

اندیس اولین یا آخرین وقوع یک زیررشته در رشته را بر م ی گرداند . اگر

تطابقی رخ ندهد، 1- بر می گرداند.

”String Poem=”kubla khan

Int n=Poem.Index of (“la”);//3

0n=Poem.Index of (“h”);//

6);//4n=Poem Index of (‘k’,

IndexOfAny/LastIndex

اندیس اولین/ آخرین کاراکتر را در یک آرایه از کاراکترهای یونیکد بر OfAny

می گرداند.

;”String Poem=”kubla khan

[Char[ ] Vowels = new char [5

;{’’, ‘u0’, ‘2a’, ‘e’, ‘‘}

N=Poem. Index of on (Vowels); //1

N=Poem. Last Index of Any (Vowels);//8

N=Poem. Index of Any (Vowels, 2);//4

#C فصل بیستم دستکاری متن دز

343

-2-4-20 جستجوی رشت هی جانشین دار

همه این تکنیک ها فرض می کنند هر رشته یک دنباله از کاراکترهای 16 بیتی را در بر دارد. فرض کنید برنامه کاربردی شما با

مجموعه کاراکتر 32 بیتی خاور دور کار می کند. اینها در حافظه به صورت یک زوج جانشین شامل یک مقدار 16 بیتی بالا و

یک مشکل پیش می آید که فقط نصف یک زوج جانشین را بر [Poem[ndx پایین نمایش داده می شوند. برای عبارتی همچون

می گرداند.

با همه کاراکترها به صورت عناصر متنی .NET در String در برنامه هایی که باید از این جانشی نها استفاده کنند، کلاس

برخورد می کند و می تواند به طور اتوماتیک یک کاراکتر 16 بیتی را از یک کاراکتر جانشین تشخیص دهد. مهمترین عضو آن

است که یک نوع شمارشی بر می گرداند. این نوع شمارشی م یتواند برای طی کردن GetTextElementEnumerator متد

سراسر عناصر متنی در یک رشته استفاده شود.

TextElementEnumerator tEnum =

StringInfo.GetTextElementEnumerator(poem) ;

while (tEnum.MoveNext()) // Step through the string

{

Console.WriteLine(tEnum.Current); // Print current char

}

پیاده سازی می شوند. Current و ()MoveNext به خاطر دارید که در انواع داده شمارشی، متدهای

-3-4-20 تبدیل رشته ها

را برای تغییر دادن یک رشته خلاصه می کند. چون رشته ی اصلی غیر قابل String 3 مهمترین متدهای کلاس - جدول 20

تغییر است، این متدها رشت ههای جدیدی ایجاد می کنند که حافظه خاص خود را دارند.

3- جدول 20

متد توصیف

یک رشته را در محل مشخص شده درج می کند. (Insert (int, string

string mariner = "and he stoppeth three";

string verse = mariner.Insert(

mariner.IndexOf(" three")," one of");

// verse --> "and he stoppeth one of three"

در سمت چپ یا راست یک رشته کاراکتر خاصی را تکرار می کند تا طول PadLeft/PadRight

رشته به مقدار معینی برسد. اگر کاراکتری مشخص نشود، کاراکتر خالی

اضافه می گردد.

string rem = "and so on";

rem =rem.PadRight(rem.Length+3,'.);

// rem --> "and so on..."

حذف می کند. p کاراکتر را با شروع از محل n تعداد (Remove(p,n

string verse = "It is an Ancient Mariner";

string newverse = (verse.Remove(0,9));

// newverse --> "Ancient Mariner"

کاراکتر یا رشته B و A . جایگزین م یکند B را با A همه ی زیررشته های (Replace(A,B

هستند.

String astring = “nap ace sap. Path”;

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

344

String istring=astring.Replace (‘a’,’1’);

//istring--> “nip ice sip pith”

لیست جدا کننده ها وجود دارد که یک رشته را به Char در آرایه ی ([]Split(Char

چندین زیررشته تقسیم م یکنند و نتیجه در یک آرای هی رشته ای بر

گردانده می شود.

string words = "red,blue orange ";

string [] split = words.Split(new Char []

{' ', ','});

Console.WriteLine(split[2]); // orange

()Toupper

(Toupper(CultureInfo

() Tolower

(Tolower(CultureInfo

یک کپی از رشته با حروف بزرگ یا کوچک بر می گردانند.

String Poem2= “kubla khan”;

Poem2=Poem2. Toupper (Culture Info. Invarian+Culture);

([]Trim (params Char

()Trim

[]Char فضاهای خالی ابتدا و انتهای رشته را حذف م یکند. اگر آرای هی

خالی نباشد، همه کاراکترهای این آرایه در ابتدا و انتهای رشته حذف

می شوند.

String name=” Samuel Coleridge”;

Nam=name.Trim( );

([]TrimEnd (params Char

TrimStart(params Char

([]

را از ابتدا یا انتهای رشته Char همه کاراکترهای مشخص شده آرای هی

باشد، فضاهای خالی حذف خواهند null حذف می کنند. اگر مقدار آرایه

شد.

String name=”Samuel Coleridge”;

Trino Name=nam. Trimstart(null);

Shortname=name. Trim END(‘e’,’g’,’I’);

//Short Name → ”Samuel Colerid”;

(SubString (n

(Substring (n,l

استخراج می کند. n یک زیر رشته به طور یک را با شروع از موقعیت

خواهد بود. L مشخص شده باشد طول این زیر رشته L اگر

String title = “kubla khan”;

Console. Write line (title. Substring (2،3)); //bla

()ToCharArray

(ToCharArray(n,l

کاراکترهای یک رشته را استخراج کرده و در یک آرایه از کاراکترهای

یونیکد قرار می دهد.

String my Vowels= “aeiou”;

Char{ ] Vowel Arr;

Vowel Arr=myVowels. Tochar Array( );

Console write line (Vowel Arr [1]);

بیشتر این متدها شبیه زبانهای دیگر هستند و همانند انتظار شما رفتار می کنند. مورد جالب این است که بیشتر این متدها

وجود دارد. Insert و Remove, Replace نیستند. فقط StringBuilder در کلاس

#C فصل بیستم دستکاری متن دز

345

-4-4-20 کدگذاری رشته

زمانی که لازم باشد رشته ها و بایت ها برای عملیاتی همچون نوشتن در یک فایل یا جاری شدن روی شبکه تبدیل گردند، از

کدگذاری رشته استفاده می کنند. کدگذاری و کدگشایی کاراکترها دو فاید هی اصلی پیشنهاد م یکنند: کارایی و قابلیت

ارتباط بین پروسه ها. بیشتر کاراکترهای متون انگلیسی می توانند با 8 بیت نمایش داده شوند. با استفاده از کدگذاری می توان

بایت اضافی را در انتقال و ذخیره سازی حذف کرد. انعطاف پذیری و رمزگذاری، ارتباط یک برنامه با داده های موروثی 1 یا

داده های ثالث 2 با فرم تهای مختلف را ممکن می سازد.

شکل های زیادی از کدگذاری و کدگشایی کاراکترها را پشتیبانی می کند. معمول ترین آنها به صورت زیر .NET چارچوب

هستند.

UTF-8

هر کاراکتر بر اساس مقدار اصلی آن با یک تا 4 بایت کدگذاری می شود. کاراکترهای سازگار با اسکی در یک بایت ذخیره

در دو بایت ذخیره م یشوند و کاراکترهایی که یک مقدار بزرگتر یا مساوی FF07X 0800 تا 0 X می شوند. کاراکترهای مابین 0

0800 دارند به سه بایت تبدیل می شوند و جانشین ها به صورت 4 بایتی نوشته می شوند. زمانی که کدگذاری مد نظر نباشد، x0

8 را بکار می برند. UTF به طور پی شفرض .NET کلاس های

UTF16

هر کاراکتر با 2 بایت کدگذاری می شوند(به استثناء جانشی نها). این کدگذاری را کدگذاری یونیکد نیز گویند.

ASCII

هستند از f7OX 00 تا OX هر کاراکتر به صورت یک کاراکتر 8 بیتی اسکی کدگذاری می شود. زمانی که همه کاراکترها مابین

این کد استفاده کنید.

انجام می شوند. این کلاس انتزاعی چندین Encoding با کلاس System.Text کدگذاری و کدگشایی در فضای نامی

8UTF ،ASCII خصوصیت ایستا دارد که برای پیاده سازی تکنیک کدگذاری خاص، یک ش ی بر می گردانند. این خصوصیات

16 است. UTF هستند. آخری برای کدگذاری Unicode و

های مختلف جهت تبدیل کاراکترها و بایت ها پیشنهاد می کند. در این مثال دو overload یک شی کدگذاری چندین متد با

عکس این عمل را GetString یک رشته متنی را به بای تها تبدیل می کند و GetBytes : متد بسیار مفید ارائه می گردد

انجام م یدهد.

string text= "In Xanadu did Kubla Khan";

Encoding UTF8Encoder = Encoding.UTF8;

byte[] textChars = UTF8Encoder.GetBytes(text);

Console.WriteLine(textChars.Length); // 24

// Store using UTF-16

textChars = Encoding.Unicode.GetBytes(text);

Console.WriteLine(textChars.Length); // 48

// Treat characters as two bytes

string decodedText = Encoding.Unicode.GetString(textChars);

Console.WriteLine(decodedText); // "In Xanadu did ... "

1 Legacy

2 Third Party

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

346

8 می تواند به صورت زیر ایجاد UTF- همچنین م یتوانید اشیاء کدگذاری را به طور مستقیم تعریف کنید. در این مثال، ش ی

شود.

UTF8Encoding UTF8Encoder = new UTF8Encoding();

پارامترهایی را برای کنترل بیشتر روی پروسه ی کدگذاری تعریف ،ASCIIEncoding سازنده ی این کلا سها به استثناء

می کنند. به عنوان مثال، مشخص می کنند در صورت مواجه شدن با یک کاراکتر نامعتبر، یک استثناء رها شود.

StringBuilder -5-20 کلاس

عیب اصلی رشت هها این است که در هر زمان با تغییر محتویات یک متغیر رشت های، باید به آن حافظه تخصیص یابد. فرض

کنید یک حلقه ایجاد کردیم که 100 بار تکرار می شود و یک کاراکتر را به یک رشته الحاق می کند. ما در حافظه 100 تا رشته

داریم که هر کدام با رشته ی قبلی فقط در یک کاراکتر اختلاف دارند.

با تخصیص یک ناحی هی کاری (بافر) که متدهای آن می توانند روی رشته اعمال شوند، این مشکل StringBuilder کلاس

را حل می نماید. این متدها راه هایی را برای الحاق کردن، درج کردن، پاک کردن، حذف کردن و جایگزین کردن کاراکترها

برای تبدیل بافر به یک رشته در متغیر رشت های استفاده می شود. ()ToString دارند. بعد از اتمام عملیات، متد

را برای ایجاد یک لیست تفکیک شده با کاما بیان می کند. StringBuilder 1 بعضی از متدهای - قطعه کد 20

1- قطعه کد 20

using System;

using System.Text;

public class MyApp

static void Main()

{

// Create comma delimited string with quotes around names

string namesF = "Jan Donna Kim ";

string namesM = "Rob James";

StringBuilder sbCSV = new StringBuilder();

sbCSV.Append(namesF).Append(namesM);

sbCSV.Replace(" ","','");

// Insert quote at beginning and end of string

sbCSV.Insert(0,"'").Append("'");

string csv = sbCSV.ToString();

// csv = 'Jan','Donna','Kim','Rob','James'

}

}

همه عملیات در یک بافر واحد رخ م یدهند و تا انتساب نهایی هیچ عمل تخصیص حافظه نیاز نیست. نگاه رسمی به این

کلاس و اعضای آن می افکنیم.

StringBuilder -1-5-20 مروری بر کلاس

یک مقدار رشته ای اولیه را همانند مقادیر صحیح می پذیرند تا مقدار فضای اولیه و StringBuilder سازنده های کلاس

حداکثر فضای تخصیص یافته به بافر را معین کنند.

// Stringbuilder(initial value)

StringBuilder sb1 = new StringBuilder("abc");

// StringBuilder(initial value, initial capacity)

StringBuilder sb2 = new StringBuilder("abc", 16);

// StringBuiler(Initial Capacity, maximum capacity)

StringBuilder sb3 = new StringBuilder(32,128);

امکان استفاده از آن به عنوان یک بافر برای انجام عملیات رشته ای است. در این مثال نحوه ی کار StringBuilder ایده ی

را می بینید. Remove و Replace ،Insert ،Append متدهای

#C فصل بیستم دستکاری متن دز

347

int i = 4;

char[] ch = {'w','h','i','t','e'};

string myColor = " orange";

StringBuilder sb = new StringBuilder("red blue green");

sb.Insert(0, ch); // whitered blue green

sb.Insert(5," "); // white red blue green

sb.Insert(0,i); // 4white red blue green

sb.Remove(1IR); // 4 red blue green

sb.Append(myColor); // 4 red blue green orange

sb.Replace("blue","violet"); // 4 red violet green orange

string colors = sb.ToString();

و الحاق رشته StringBuilder -2-5-20 مقایسه ی

را در برابر عملگر الحاق آزمایش م یکند. بخش اول این برنامه عملگر + را برای StringBuilder 2 بهره وری - قطعه کد 20

به یک رشته در حلق های با 50000 تکرار بکار می برد. بخش دوم نیز همان کار را انجام م یدهد. اما متد ’a‘ الحاق حرف

زمان شروع و پایان را در واحد میلی ثانیه ، Environment.TickCount . را بکار می برد StringBuilder.Append

تهیه می کند.

2- قطعه کد 20

using System.Text;

public class MyApp

static void Main()

{

Console.WriteLine("String routine");

string a = "a";

string str = string.Empty;

int istart, istop;

istart = Environment.TickCount;

Console.WriteLine("Start: "+istart);

// Use regular C# concatenation operator

for(int i=0; i<50000; i++)

{

str += a;

}

istop = Environment.TickCount;

Console.WriteLine("Stop: "+istop);

Console.WriteLine("Difference: " + (istop-istart));

// Perform concatenation with StringBuilder

Console.WriteLine("StringBuilder routine");

StringBuilder builder = new StringBuilder();

istart = Environment.TickCount;

Console.WriteLine("Start: "+istart);

for(int i=0; i<50000; i++)

{

builder.Append(a);

}

istop = Environment.TickCount;

str = builder.ToString();

Console.WriteLine("Stop: "+Environment.TickCount);

Console.WriteLine("Difference: "+ (istop-istart));

}

}

اجرای این برنامه خروجی زیر را نتیجه م یدهد.

String routine

Start: 1422091687

Stop: 1422100046

Difference: 9359

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

348

StringBuilder routine

Start: 1QOONMMMQS

Stop: 1422100062

Difference: 16

StringBuilder . طول می کشد StringBuilder الحاق استاندارد مدت زمان 9,359 میلی ثانیه در برابر 16 میلی ثانیه

هیچ مزیت مهمی ندارد، مگر اینکه در دستکاری پیشرفته متن به جای الحاق استاندارد استفاده شود.

-6-20 فرمت دهی مقادیر عددی، تاریخ و زمان

وسیله ی اصلی فرمت دهی تاریخ و داده های عددی جهت نمایش است. آن یک رشته مرکب از متن و String.Format متد

عناصر فرمت تعبیه شده در آن را به همراه یک یا چند آرگومان داد های می پذیرد. هر عضو فرمت به یک آرگومان داد های

رشته ی خروجی را با تبدیل هر مقدار داد های به یک رشته، CLR . ارجاع می کند و نحو هی فرمت دهی آن را مشخص م یکند

فرمت دهی آن با توجه به عنصر فرمت دهی متناسب و جایگزینی آن در مقدار فرمت دهی شده، ایجاد می کند. این یک مثال

ساده است.

String s= String.Format("The square root of {0} is {1}.",64,8);

// output: The square root of 64 is 8.

دارد. اما این معمو لترین است و دو ویژگی مشترک همه را ارائه م یکند: یک رشت ه ی فرمت و Overload این متد چندین

همان پارامترها را می گیرد و می تواند به Console.WriteLine یک لیست از آرگوما نهای داده ای. توجه کنید که متد

در خروجی کنسول استفاده شود. String.Format جای متد

-1 ساختن یک عنصر فرمت -6-20

را به اجزاء پای های آن می شکند. جالب ترین آنها عنصر فرمت است که روش نمایش داده String.Format 3 مثال - شکل 20

را تعریف می کند.

3- شکل 20

همانطور که می توانید ببینید، هر عنصر فرمت یک اندیس و یک آرگومان اختیاری ترازبندی و رشت هی فرمت را شامل است.

همه ی آنها در بین کاراکترهای {} قرار می گیرند.

1. اندیس یک مقدار صحیح با پایه صفر است که آرگومان داد های مرتبط با آن را نشان می دهد. اندیس می تواند چند بار در

یک رشته تکرار شود.

2. ترازبندی اختیاری، یک عدد صحیح است که حداقل طول ناحی هی مربوط به مقدار فرم تدهی شده را مشخص می کند.

اگر مقدار ترازبندی مثبت باشد، مقدار آرگومان، راس تچین است. اگر مقدار آن منفی باشد، آن چ پچین است.

#C فصل بیستم دستکاری متن دز

349

3. رشته فرمت اختیاری، کدهای فرم تدهی اعمال شده به مقدار آرگومان را در بر دارد. اگر آن مشخص نشده باشد،

چندین کد فرمت استاندارد برای ایجاد رشت ههایی با .NET . مربوط به آرگومان استفاده می شود ToString خروجی متد

فرمت سفارشی فراهم کرده است.

-2 فرمت دهی مقادیر عددی -6-20

9 کاراکتر یا مشخص ههای فرمت برای فرمت دهی اعداد به پول رایج، علمی، هگزادسیمال و نمایش های دیگر در دسترس

هستند. برای مشخص کردن دقت می توانید به هر کاراکتر یک عدد الحاق کنید. معمولاً این عدد تعداد ارقام اعشار را مشخص

4 را تشخیص م یدهد. - مشخصه های فرمت استاندارد جدول 20 #C . می کند

4- جدول 20

علامت

فرمت

توصیف الگو خروجی

عدد به صورت یک مقدار پولی نمایش م یگردد. دقت، C یا c

تعداد ارقام اعشار را نشان م یدهد.

1،458,75 $ 1458,75},2C:0}

اعداد دهدهی. به اعداد صحیح اعمال می گردد. دقت- D یا d

تعداد کل فضای اشغالی را مشخص می کند. فضاهای

خالی با صفر پر م یشوند.

۴۵۵}, ۵D:٠}

۴۵۵}, -۵D:٠}

00455

00455-

علمی. عدد به نمایش علمی تبدیل م یشود. E یا e

دقت تعداد ارقام اعشار را مشخص م یکند. ddddE+nnm

{٠،١٠:E٢}, ٣٢٩٨٫٧٨

+3,30 {٠،١٠:E۴}, -۵۴٧٨٣٫۴ 003E

-

5.4783+E004

تبدیل dddd.ddd نقطه اعشار ثابت. عدد به فرمت F یا f

می شود. دقت، تعداد ارقام اعشار را مشخص می کند.

{٠،١٠:F٠}, ١۶٢٫۵٧

162 {٠،١٠:F٢}, ٨١۶٢٫۵٧

8162,57

کلی. عدد بر اساس دقت و نوع عدد به اعشار ثابت یا G یا g

نمایش علمی تبدیل م یگردد. در صورتی که توان

بزرگتر مساوی دقت یا کمتر از - 4 باشد، از نمایش

علمی استفاده می شود.

{٠،١٠:G}, .٠٠٠٠٠٩٩

{٠،١٠:G٢}, ۴۵۵٫٨٩

{٠،١٠:G٣}, ۴۵۵٫٨٩

{٠،١٠:G},٧٨٣٢٢٩٫٣۴

9.9E-06

4.6E+02

456

783229.34

عدد. عدد را به یک رشته تبدیل می کند که هر 1000 با N یا n

کاما جدا می شود. تعداد ارقام اعشار را دقت مشخص

می کند.

{٠،١٠:N}, ١٠۴۵٫٧٨

{٠،١٠:N١}, ۴۵٫٩٨

1,045.78

4RKV

درصد. عدد به صد تقسیم می شود و به صورت درصد P یا p

نمایش داده می شود. تعداد ارقام اعشار با دقت

مشخص می گردد.

{٠،١٠:P}, ٠٫٧٨

{٠،١٠:P٣}, ٠٫٧٨۶۵

78.00 %

78.650 %

گرد کردن. عدد را به یک رشته تبدیل می کند که همه R یا r

ارقام اعشار به درستی حفظ م یشوند. باید عدد از نوع

اعشاری شناور باشد.

1.62736 {٠،١٠:R}, ١٫۶٢٧٣۶

هگزا دسیمال. عدد را به نمایش هگزا تبدیل می کند. X یا x {٠،١٠:X}, ٢۵

{٠،١٠:X۴}, ٢۵

{٠،١٠:x۴}, ٣١

19

001V

001f

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

350

دقت عدد حداقل تعداد ارقام قابل نمایش را نشان

می دهد. فضاهای اضافی با صفر پر می شوند.

قابل استفاده هستند. Console.WriteLine و Console.Write الگوهای این جدول مستقیماً در دستور

Console.WriteLine("The Hex value of {0} is {0:X} ",31); //1F

بکار روند. ToString علامت های فرمت م یتوانند برای بهبود خروجی متد

decimal pct = .758M;

Console.Write("The percent is "+pct.ToString("P2")); // 75.80 %

کاراکترهای فرمت دهی خاصی را برای ایجاد فرمت های عددی سفارشی فراهم می کند. معمول ترین آنها عبارتند از: #( .NET

علامت عدد)، 0(صفر)، ,(کاما)، . (نقطه)، % (درصد) و ;(سمی کالن). کد زیر کاربرد آنها را نشان می دهد.

decimal dVal = 2145.88M; // decimal values require M suffix

string myFormat;

myFormat = dVal.ToString("#####"); // 2146

myFormat = dVal.ToString("#,###.00"); // 2,145.88

myFormat = String.Format("Value is {0:#,###.00;

(#,###.00)}",-4567);

// semicolon specifies alternate formats. (4,567.00)

myFormat = String.Format("Value is {0:$#,###.00}", 4567);

// $4,567.00

Console.WriteLine("{0:##.00%}",.18); // 18.00 %

همه این کاراکترها به استثناء ; خود توصیف هستند. آن فرمت را به دو گروه تقسیم می کند. گروه اول به مقادیر مثبت و گروه

دوم به مقادیر منفی اعمال می شوند. دو سمی کالن برای ایجاد سه گروه برای اعداد مثبت، منفی و مقادیر صفر استفاده

می شوند.

-3 فرمت دهی تاریخ و زمان -6-20

نیاز داریم. همانند اعداد، این ش ی نیز مجموعه علائم استاندارد فرمت خود را DateTime در فرم تدهی تاریخ به یک ش ی

5 خلاصه ی آنها آمده است. - دارد. در جدول 20

5- جدول 5

علامت

فرمت

توصیف مثال انگلیسی مثال آلمانی

19,1,2004 2004/19/ تاریخ کوتاه 1 d

Monday, January تاریخ بلند D

19, 2004

Montag, 19

Januar,2004

Monday, January ( زمان/تاریخ کامل (زمان کوتاه f

19, 2004 4:05 PM

Montag, 19

Januar, 2004

16:05

Monday, January ( زمان/ تاریخ کامل (زمان کامل F

19, 2004 4:05:20 PM

Montag, 19

Januar,2004

16:05:20

6:05 2004/1/19 PM 4:05 2004/19/ زمان/ تاریخ کلی (زمان کوتاه) 1 g

16:05:20 2004/1/19 PM 4:05:20 2004/19/ زمان/ تاریخ کلی (زمان بلند) 1 G

#C فصل بیستم دستکاری متن دز

351

Januar 19 January روز/ ماه 19 m,M

Januar, 2004 January, ماه/ سال 2004 y,Y

16:05 PM زمان کوتاه 4:05 t

16:05:20 PM زمان بلند 4:05:20 T

8601 مطابقت Iso با زمان/ تاریخ جهانی S

می کند. زمان محلی را بکار می برد.

19 -01 -2004 16:05:20T 9 -01 -2004

16:05:20T

19 -01 -2004 Z16:05:20 19 -01 - زمان - تاریخ جهانی 2004 u

Z16:05:20

زمان تاریخ جهانی زمان جهانی را بکار U

می برد.

Monday, January

19،2004 21:05:20 PM

Montag, 19.

,Januar

21:05:20 2004

به عنوان آرگومان DateTime دستورات زیر تعدادی مثال فرمت دهی تاریخ را نشان می دهند. در هر کدام، یک شی از نوع

به یک رشته ی فرمت رد می شود.

DateTime curDate = DateTime.Now; // Get Current Date

Console.Writeline("Date: {0:d} ", curDate); // 1/19/2004

// f: --> Monday, January 19, 2004 5:05 PM

Console.Writeline("Date: {0:f} ", curDate);

// g: --> 1/19/2004 5:05 PM

Console.Writeline("Date: {0:g} ", curDate);

اگر هیچ کدام از علائم استاندارد فرمت نیاز شما را برآورده نسازد، می توانید یک فرمت سفارشی را با یک دنباله از

6، چند نمونه مفید در فرم تدهی تاری خها را لیست می کند. - کاراکترهای زیر ایجاد کنید. جدول 20

6- جدول 20

فرمت توصیف

روز ماه. صفر اضافی وجود ندارد. d

روز ماه. همیشه دو رقم وجود دارد. dd

روز هفته. با سه کاراکتر اختصار ddd

نام کامل روز هفته dddd

عدد ماه. بدون صفر اضافی M

عدد ماه. همیشه دو رقم دارد MM

نام ماه با سه حرف اختصار MMM

نام کامل ماه MMMM

یک یا دو رقم آخر سال y

یک یا دو رقم آخر سال. در صورت نیاز صفر اضافی قرار می گیرد. yy

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

352

چهار رقم سال yyyy

ساعت در فرمت 24 ساعتی HH

دقیقه. در صورت نیاز با صفرهای اضافی mm

اینها مثال هایی از فرم تهای سفارشی تاریخ هستند.

DateTime curDate = DateTime.Now;

f = String.Format("{0:dddd} {0:MMM} {0:dd}", curDate);

// output: Monday Jan 19

f = currDate.ToString("dd MMM yyyy")

// output: 19 Jan 2004

// The standard short date format (d) is equivalent to this:

Console.WriteLine(currDate.ToString("M/d/yyyy")); // 1/19/2004

Console.WriteLine(currDate.ToString("d")); // 1/19/2004

CultureInfo ci = new CultureInfo("de-DE"); // German

f = currDate.ToString("dd-MMMM-yyyy HH:mm", ci)

// output: 19-Januar-20MQ 23:07

ترجیح داده می شود. آن گرامر مناسبی برای تعبیه String.Format به ToString در فرمت دهی سفارشی تاریخ، متد

فضاهای خالی و جداکنند ههای خاص مابین عناصر تاریخ دارد. به علاوه، پارامتر دوم آن یک مشخص کننده فرهنگ است.

-4 تاریخ ها و فرهنگ -6-20

.NET در سراسر جهان، تاریخ ها به روش های مختلفی نمایش داده می شوند. توانایی اضافه کردن فرهنگ در فرمت دهی توسط

است، به طور اتوماتیک تاری خها German ، بارکاری توسع هدهنده را کاهش داده است. برای مثال، اگر فرهنگ سیستم شما

را منعکس کنند. روز قبل از ماه قرار می گیرد و روز و ماه و سال با نقطه از هم جدا European فرمت دهی م یشوند تا فرمت

مشخص می شود. این مثال . Januar19Montag, 19 به صورت Monday , January می شوند (به جای /) و عبارت

به کار می برد. German با فرهنگ CultureInfo را با پارامتر ToString متد

CultureInfo ci = new CultureInfo("de-DE"); // German

Console.WriteLine(curDate.ToString("D",ci));

// output ---> Montag, 19. Januar 2004

Console.WriteLine(curDate.ToString("dddd",ci)); // -->Montag

را برای چاپ کردن نام کامل روز هفته بکار می رود. این فرمت در برابر خصوصیت ”dddd“ آخرین دستور فرمت سفارشی

است که فقط یک مقدار انگلیسی بر می گرداند. DateTime.DayOfWeek شمارشی

NumberFormatInfo و DateTimeFormatInfo کلاس های

این دو کلاس نحوة اعمال فرم تهای بیان شده قبلی روی تاری خها و اعداد را مدیریت م یکنند. برای مثال، کلاس

خصوصیاتی دارد که کاراکتر سمبل پول، کاراکتر جدا کنندة دهدهی و تعداد ارقام دهدهی برای NumberFormatInfo

خصوصیاتی تعریف می کند که به DateTimeFormatInfo نمایش یک مقدار پول را مشخص می کند. به طور مشابه، کلاس

FullDateTimePattern طور مجازی با همه علائم استاندارد فرمت تاریخ ها یکسان هستند. به عنوان مثال، خصوصیت

برای فرمت دهی تاریخ م یباشد. F می باشد که معادل علامت فرمت

با فرهنگ های خاص مرتبط هستند و خصوصیات آنها DateTimeFormatInfo و NumberFormatInfo کلاس های

یک مجموعهی از پیش تعریف .NET . وسیله ای برای ایجاد فرم تهای منحصر به فرد مورد نیاز فرهن گهای مختلف هستند

کرد. override شده از مقادیر خصوصیت برای هر فرهنگی فراهم می کند، که نمیتوان آنها را

#C فصل بیستم دستکاری متن دز

353

بر اساس این که آیا فرهنگ جاری یا غیره ارجاع می شوند، این خصوصیات می توانند به رو شهای مختلفی دستیابی شوند.

دستورات زیر به فرهنگ جاری ارجاع دارند.

NumberFormatInfo.CurrentInfo.<property>

CultureInfo.CurrentCulture.NumberFormat.<property>

را بکار م یبرد و قطعاً فرهنگ جاری را بکار میبرد. دستور دوم یک فرهنگ CurrentInfo دستور اول خصوصیت ایستای

مناسب است. CultureInfo را بطور صریح مشخص می کند و برای دسترسی به خصوصیات فرهنگ دیگر یک نمونه از

CultureInfo ci = new CultureInfo("de-DE");

string f = ci.NumberFormat.CurrencySymbol;

که در ارتباط با فرهنگ غیر جاری هستند، DateTimeFormatInfo و NumberFormatInfo خصوصیاتی از کلا سهای

3 یک نمونه از نحوهی کار با این کلاس ها را پیشنهاد می کند - می توانند تغییر یابند. قطعه کد 20

3- قطعه کد 20

using System

using System.Globalization

Class MyApp

// NumberFormatInfo

string curSym = NumberFormatInfo.CurrentInfo.CurrencySymbol;

int dd = NumberFormatInfo.CurrentInfo.CurrencyDecimalDigits;

int pdd = NumberFormatInfo.CurrentInfo.PercentDecimalDigits;

// --> curSym = "$" dd = 2 pdd = 2

// DateTimeFormatInfo

string ldp= DateTimeFormatInfo.CurrentInfo.LongDatePattern;

// --> ldp = "dddd, MMMM, dd, yyyy"

string enDay = DateTimeFormatInfo.CurrentInfo.DayNames[1];

string month = DateTimeFormatInfo.CurrentInfo.MonthNames[1];

CultureInfo ci = new CultureInfo("de-DE");

string deDay = ci.DateTimeFormat.DayNames[1];

// --> enDay = "Monday" month = February deDay = "Montag"

// Change the default number of decimal places

// in a percentage

decimal passRate = .840M;

Console.Write(passRate.ToString("p",ci)); // 84,00%

ci.NumberFormat.PercentDecimalDigits = 1;

Console.Write(passRate.ToString("p",ci)); // 84,0%

}

برای برآورده ک ر دن نیاز شما به فرم ت دهی تاریخ ها و اعداد، الگوهای متنوعی را پیشنهاد م ی کند . برای NET. ، خلاصه اینکه

وجود دارند که سمب ل ها و قوانین مورد استفاده در DateTimeFormatInfo و NumberFormatInfo این منظور دو کلاس

به ازای هر فرهنگ خصوصیات فرمت خاص آن را فراهم کرده است. NET. . فرمت دهی را تعریف می کنند

-7-20 عبارات منظم

، کاربرد رشته ها و عبارت منظم برای انجام تطابق الگو از زمان اولین زبان های برنامه نویسی بوده است. در اواسط 1960

Grep . تأثیر گذاشت Unix در محیط Grep برای بیان هدف دستکاری رشته و متن طراحی شد. آن بر روی ابزار SNOBOL

یا هر زبان اسکریپتی دیگر کار کرد هاند، شباهت Perl یا Grep کاربرد عبارات منظم را گسترده ساخت. همهی آنهایی که با

را تشخیص خواهند داد. NET. پیاده سازی عبارات منظم در

تطابق الگو بر اساس مفهوم سادهی اعمال یک الگوی رشت های خاص به متون، برای تطابق یک نمونه یا نمونه هایی از آن الگو

بیان می گردد. Regex در متن است. بر خلاف متن، الگوی اعمال شده یک عبارت منظم یا به اختصار

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

354

Regex -1-7-20 کلاس

به عنوان موتور ارزیابی عبارات منظم است و الگوها را به رشته های هدف اعمال می کند. این کلاس Regex فرض کنید کلاس

متدهای ایستا و نمونه فراهم می کند که عبارات منظم را برای جستجوی متن، استخراج و جایگذاری بکار م یبرند. کلاس

یافته می شوند. System.Text.RegualarExpressions و همهی کلاس های مرتبط با آن، در فضای نامی Regex

گرامر

Regex( string pattern )

Regex( string pattern, RegexOptions)

پارامترها:

عبارت منظم برای تطابق الگو : Pattern

یک نوع شمارشی که مقادیر آن نحوهی اعمال عبارت منظم را کنترل می کند. مقادیر آن عبارتند از: :Regex Options

از فرهنگ صرفنظر می کند. -CultureInvariant

از حالت حروف صرفنظر می کند. – IgnoreCase

رشته را از چپ به راست پردازش می کند. – RightToLeft

مثال:

Regex r1 = new Regex(" "); // Regular expression is a blank

String words[] = r1.Split("red blue orange yellow");

// Regular expression matches upper- or lowercase "at"

Regex r2 = new Regex("at", RegexOptions.IgnoreCase);

کاملاً ساده است. اولین پارامتر سازنده یک عبارت منظم است. Regex همانطور ____________که مثال نشان می دهد، ایجاد یک شی

است که نحوهی اعمال عبارت منظم را کنترل می کند. RegexOptions پارامتر اختیاری دوم، یک یا چند مقدار شمارشی

Regex متدهای

Matches و Match ،Split ،Replace ،IsMatch تعدادی متد برای تطابق الگو و دستکاری متن دارد. آنها Regex کلاس

های ایستا و نمونه ای دارند که شبیه هستند، اما یکسان نیستند. Overload را شامل هستند. آنها

موثرتر است. زمانی که شی ایجاد می شود، آن Regex اگر بخواهید یک عبارت منظم را مکرراً بکار برید، ایجاد یک ش ی

عبارت منظم را به یک فرم خاصی کامپایل می کند و تا زمان وجود ش ی می توان از آن استفاده کرد. بر خلاف آن، متدهای

ایستا در زمان استفادهی عبارت، آن را مجدداً کامپایل می کنند.

را بررسی کنیم. در این مثال ها، هدف معرفی متدهای عبارت های منظم است. به Regex حال اجازه دهید برخی از متدهای

همین دلیل از مثا لهای ساده استفاده می شود.

()IsMatch

این متد عبارت منظم را با یک رشته ورودی مطابقت می دهد و یک مقدار بر می گرداند. این مقدار مشخص می کند، آیا یک

تطابق پیدا شده است.

string searchStr = "He went that a way";

Regex myRegex = new Regex("at");

// instance methods

bool match = myRegex.IsMatch(searchStr); // true

// Begin search at position 12 in the string

match = myRegex.IsMatch(searchStr,12); // false

#C فصل بیستم دستکاری متن دز

355

// Static Methods – both return true

match = Regex.IsMatch(searchStr,"at");

match = Regex.IsMatch(searchStr,"AT",RegexOptions.IgnoreCase);

()Replace

این متد یک الگوی مطابقت شده را با یک رشتهی خاص جایگزین می کند و نتیجه را بر می گرداند. این متد چندین

برای مشخصکردن محل شروع جستجو و تعداد جایگزین یها دارد. overload

گرامر

static Replace (string input, string pattern, string replacement

[,RegexOptions])

Replace(string input, string replacement)

Replace(string input, string replacement, int count)

Replace(string input, string replacement, int count, int startat)

محل شروع عمل جستجوی تطابق ها را نشان می دهد. StartAt . حداکثر تعداد تطبی قها را مشخص میکند Count پارامتر

را می پذیرد. هر وقت یک تطابق پیدا شود، این MatchEvaluator این متد نسخ ههای مختلفی دارد که یک پارامتر نماینده

نماینده فراخوانی می شود و می تواند برای سفارشیکردن پروسهی جایگزینی استفاده شود.

قطعه کد زیر شک لهای ایستا و نمونه متد را ارائه می کند.

string newStr;

newStr = Regex.Replace("soft rose","o","i"); // sift rise

// instance method

Regex myRegex = new Regex("o"); // regex = "o"

// Now specify that only one replacement may occur

newStr = myRegex.Replace("soft rose","i",1); // sift rose

()Split

()String.Split این عمل رشته را با توجه به مح لهای تطابق یافته شده به یک آرایه تفکیک می کند. آن شبیه متد

است، با این استثناء که تطابق به جای یک کاراکتر با رشتهی کاراکتری و بر اساس یک عبارت منظم انجام میشود.

گرامر

String[] Split(string input)

String[] Split(string input, int count)

String[] Split(string input, int count, int startat)

Static String[] Split(string input, string pattern)

پارامترها

رشته مورد نظر جهت تفکیک :Input

حداکثر تعداد عناصر آرایه، مقدار صفر هر تعداد عنصر را ممکن می سازد. اگر تعداد تطابق ها از حداکثر بیشتر باشد، :Count

آخرین بخش مابقی رشته را در بر دارد.

محل شروع جستجو در رشتهی ورودی را مشخص م یکند. :Startat

الگوی عبارت منظم برای تطبیق با رشته ورودی است. :Pattern

مثال کوتاه زیر یک رشته شامل لیستی از اسامی هنرمندان را تجزیه کرده و در یک آرایه قرار می دهد. یک کاما و به دنبال

آن صفر یا چند فضای خالی اسامی را از هم جدا می کند. عبارت منظم برای تطبیق این جداساز",[ ]*" است. نحوهی ایجاد

این عبارت را بعداً خواهید دید.

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

356

// Regex to match a comma followed by 0 or more spaces

string patt = @",[ ]*";

// Static method

string[] artists = Regex.Split(impressionists, patt);

// Instance method is used to accept maximum of four matches

Regex myRegex = new Regex(patt);

string[] artists4 = myRegex.Split(impressionists, 4);

foreach (string master in artists4)

Console.Write(master);

// Output --> "Manet" "Monet" "Degas" "Pissarro,Sisley"

()Matches() , Match

واحد بر Match یک شی ()Match این متدها یک رشته ورودی را برای تطابق با عبارت منظم جستجو می کنند. متد

یک کلکسیون از همهی تطابق ها) را بر می گرداند. ) MatchCollection شی ()Matches می گرداند و متد

گرامر

Match Match(string input)

Match Match(string input, int startat)

Match Match(string input, int startat, int numchars)

static Match(string input, string pattern, [RegexOptions])

بر می گرداند. MatchCollection های مشابهی دارد، اما یک ش ی overload ،Matches() متد

بسیار غنی بوده و خصوصیاتی همچون رشته تطبیق Match هستند. شی Regex مفیدترین متدهای Matches و Match

دارد که شکستن یک الگوی تطبیق به چندین Groups شده، طول آن و محل آن در رشته ورودی را دارد. آن یک خصوصیت

را نشان می دهد. Match 7 اعضای انتخابی از کلاس - زیررشته تطبیقشده را مجاز می دارد. جدول 20

7- جدول 20

عضو توصیف

این خصوصیت محل اولین کاراکتر تطابق یافته در رشته را بر می گرداند. Index

یک کلکسیون از گرو ههای کلاس. گروه ها بوسیلهی قرار دادن بخش هایی از عبارت منظم در Groups

Groups پارامتر ایجاد می شوند. متنی که با الگوی داخل پرانتزها تطابق دارد در کلکسیون

قرار می گیرند.

طول رشتهی تطبیق شده Length

می باشد. false یا true ، وابسته به یافتن یک تطبیق Success

زیر رشتة تطبیق شده را بر می گرداند. Valve

جدید بر اساس کاراکترهای بعد از تطبیق قبلی بر م یگرداند. Match یک NextMatch

کد زیر کاربرد اعضای این کلاس را نشان م یدهد. توجه کنید که نقطه (.) در عبارت منظم به صورت یک کاراکتر عام

(جایگزینی) عمل می کند که با هر کاراکتری مطابقت دارد.

string verse = "In Xanadu did Kubla Khan";

string patt = ".an..."; // "." matches any character

Match verseMatch = Regex.Match(verse, patt);

#C فصل بیستم دستکاری متن دز

357

Console.WriteLine(verseMatch.Value); // Xanadu

Console.WriteLine(verseMatch.Index); // 3

//

string newPatt = "K(..)"; //contains group(..)

Match kMatch = Regex.Match(verse, newPatt);

while (kMatch.Success) {

Console.Write(kMatch.Value); // -->Kub -->Kha

Console.Write(kMatch.Groups[1]); // -->ub -->ha

kMatch = kMatch.NextMatch();

}

انتساب می دهد. kMatch را برای طیکردن سراسر رشتهی هدف بکار م یبرد و هر تطبیق را به NextMatch این مثال متد

بدون هیچ اثری روی الگوی اصلی آن را به گروه هایی تقسیم می کند. در این مثال، newPatt پرانتزهای دو طرف دو نقطه در

انتساب داده م یشوند. Groups به اشیاء K دو کاراکتر بعد از

بعضی اوقات ممکن است یک برنامه نیاز داشته باشد قبل از پردازش تطبی قها آنها را در یک کلکسیون جمع کند. این کار

است و با استفاده از متد Match است. این کلاس فقط یک ظرف برای نگه داشتن اشیاء MatchCollection هدف کلاس

یک عضو Item مفیدترین خصوصیت آن است و تعداد تطبی قها را بر می گرداند و Count . ایجاد می شود Regex.Matches

مثال قبلی آمده است. NextMatch واحد از کلکسیون را بر م یگرداند. در این جا روش دیگر نوشتن حلقهی

string verse = "In Xanadu did Kubla Khan";

String newpatt = "K(..)";

foreach (Match kMatch in Regex.Matches(verse, newpatt))

Console.Write(kMatch.Value); // -->Kub -->Kha

// Could also create explicit collection and work with it.

MatchCollection mc = Regex.Matches(verse, newpatt);

Console.WriteLine(mc.Count); // 2

-2-7-20 ایجاد عبارات منظم

استفاده شده اند، فقط عبارت های منظم ابتدایی را بکار گرفتند. حال، Regex مثال هایی که تا به حال برای ارائه متدهای

کاوش می کنیم چگونه عبارت منظم واقعی و مفید ایجاد کنیم. اگر این موضوع برای شما تازه است، شما طراحی عبارات منظم

را با پروسه آزمایش و خطا کشف خواهید کرد. البته تقریباً همه الگوهای عمومی مورد استفاده روی یک سایت وب یافته

.(www.regexlib.com) را نگه می دارد Regex می شود. این سایت یک کتابخانة قابل جستجو از الگوهای

یک عبارت منظم به چهار نوع مختلف از فراکاراکترها تقسیم م یشود که هر کدام نقش خاصی از پروسه تطبیق دارند.

هر رقم از 0 تا 9 را تطبیق م یدهد. d\ کاراکترهای تطبیق: اینها یک نوع خاصی از کاراکتر را تطبیق م یدهند. برای مثال

برای d\d\d\ 3} می تواند به جای d{\ : کاراکترهای تکرار: از تکرار یک کاراکتر یا عنصر تطبیقی جلوگیری می کند. برای مثال

سه رقم تطبیقی استفاده شود.

3} لازم است تطبیق در d{\^ : کاراکترهای موقعیتی: محلی از رشتهی مقصد که یک تطبیق در آنجا باید رخ دهد. برای مثال

ابتدای رشته رخ دهد.

کاربرد \ قبل از یک کاراکتر مفهوم خاصی م یرساند. برای مثال \} اجازه می دهد کروشهی بسته در :Escape کاراکترهای

رشته تطبیق باشد.

8 الگوهای معروف را خلاصه می کند. - جدول 20

8- جدول 20

الگو معیار تطبیق مثال

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

358

+ یک یا چند رخداد از عنصر قبلی را تطبیق

می دهد.

را تطبیق می دهد. tooo و too عبارات to+

را تطبیق دهد. t آن نمی تواند

٭ صفر یا چند رخداد از عنصر قبلی را تطبیق

می دهد.

را تطبیق tooo ،too ،t رشته های *To

می دهد.

؟ صفر یا یک رخداد از عنصر قبلی را تطبیق

می دهد. تطبیق غیر حریصانه را انجام می دهد.

را تطبیق tn یا ten رشتههای Te?n

را نم یتواند تطبیق دهد. Teen . می دهد

رخداد از کاراکتر قبلی را تطبیق n دقیقاً {n}

می دهد.

را تطبیق م یدهد. teen رشتههای Te{2}n

را تطبیق نمی دهد. teeen یا Ten

رخداد از کاراکتر قبلی را تطبیق n حداقل {,n}

می دهد.

را تطبیق teen و ten رشته های {,Te{1

را تطبیق نم یدهد. tn . می دهد

رخداد کاراکتر قبلی را m و حداکثر n حداقل {n,m}

تطبیق می دهد.

را تطبیق teen و Ten رشتههای te{1،2}n

می دهد.

\ کاراکتر بعدی را به صورت حرف در نظر

می گیرد. در مورد کاراکترهایی که معنای

و ؟ + ،α خاصی دارند استفاده می شوند.مانند

را تطبیق می دهد. چون + A+B رشته ،A\+B

معنی خاصی دارد \ لازم است.

d\

D\

را تطبیق (D\) یا غیر رقم ( d\) هر تعداد رقم

- 9] یا [ 0 - می دهد. اینها به ترتیب معادل [ 0

98 ] هستند.

رشته ی 55 را تطبیق م یدهد. d\d\

را تطبیق م یدهد. XX رشته ی ، D\D\

w\

W\

هر کلمه را به همراه زیر خط تطبیق می دهد. و

a-] با w\ . موارد دیگر را تطبیق می دهد W\

a-zA-^] با W\ 9-0 _] معادل است و zA-Z

9-0 _] معادل است. Z

19 را تطبیق م یدهد. A_ ،w\w\w\w\

را تطبیق می دهد. ($) ، W\W\W\

n \r\

t \v\

f\

به ترتیب خط جدید، کاراکتر بازگشت، پرش

افقی، پرش عمودی یا صفحه جدید را تطبیق

می دهد.

s\

S\

هر S\ هر تعداد کاراکتر فضای خالی و s\

تعداد کاراکتر غیر فضای خالی را تطبیق

tab یا Space می دهد. فضای خالی یک

است.

را تطبیق A B C , \w\S\w\S\w

می دهد.

0(نقطه) هر کاراکتر واحد را تطبیق م یدهد. خط جدید

را تطبیق نم یدهد.

را تطبیق می دهد. ولی Abc رشته ی a.c

را تطبیق نم یدهد. abcc

را تطبیق م یدهد. ”enquiry “in|en منطقی OR |

0 ] هر کاراکتر داخل کروشهها را تطبیق میدهد. 0 0]

از خط تیره برای مشخص کردن محدوده

یک [d\D\] . را تطبیق می دهد aeiou] u]

رقم یا یک غیر رقم را تطبیق م یدهد.

#C فصل بیستم دستکاری متن دز

359

می توان استفاده کرد.

0 0 0] 8 ] همه کاراکترها به استثناء کاراکترهای داخل

کروشه را تطبیق م یدهد.

aeiou ] 8 را تطبیق م یدهد. x ،]

یک مثال تطابق الگو

این الگوهای کاراکتری را برای ایجاد یک عبارت منظم جهت تطبیق یک شماره تأمین اجتماعی اعمال کنید.

bool iMatch = Regex.IsMatch("245-09-8444",@"\d\d\d-\d\d-\d\d\d\d");

این یک روش بسیار سر راست است، که هر کاراکتر شماره تأمین اجتماعی با یک کاراکتر در عبارت منظم تطابق دارد. آن

ساده به نظر می رسد، ولی در رشته های بلند تکرار این کاراکترها مزاحمت ایجاد می کند. کاراکترهای تکرار این عمل را بهبود

می دهند.

bool iMatch = Regex.IsMatch("245-09-8444",@"\d{3}-\d{2}-\d{4}");

می توانیم محدودیت های دیگری روی شماره تأمین اجتماعی بررسی کنیم. ممکن است بخواهید مطمئن شوید، آن روی یک

خط بوده و در ابتدا یا انتهای خط است. این نیاز دارد کاراکترهای موقعیت را در ابتدا یا انتهای دنباله تطبیق بکار برید.

فرض کنید، می خواهیم مطمئن شویم شماره تأمین اجتماعی فقط روی یک خط باشد. برای انجام این کار دو کاراکتر لازم

داریم. یکی برای اطمینان از اینکه تطبیق در ابتدای خط است و دیگری برای اطمینان از اینکه تطبیق در انتهای خط است. با

9 کاراکترهای 8 و $ در عبارت منظم برای برآوردن این شرط می توانند استفاده شوند. رشته ____________جدید به - توجه به جدول 20

صورت زیر خواهد بود.

@"^\d{3}-\d{2}-\d{4}$"

9- جدول 20

کاراکتر موقعیت توصیف

^ الگوی بعد از آن باید در ابتدای رشته یا خط باشد.

$ الگوی قبل از آن باید در انتهای خط یا انتهای رشته باشد.

الگوی قبل از آن باید در ابتدای یک رشته باشد. A\

تا مرز یک کلمه حرکت میکند. که میتواند یک کاراکتر کلمه یا کاراکتر غیر کلمه b \B\

باشد.

یا در انتهای رشته قبل از یک خط جدید باشد. (Z\) الگو باید در انتهای رشته z \Z\

این کاراکترهای موقعیت، هیچ فضایی در عبارت نمی گیرند، آنها فقط محلی که باید تطابق رخ دهد را مشخص می کنند.

کاراکترهای مابین خط فاصله را به سه گروه تقسیم کنید. برای ایجاد گروه، ،SSN به عنوان یک بهبود نهایی روی الگوی

بخش های مورد نظر را در داخل پرانتزها قرار دهید. در این حالت می توانید هر بخش را به طور مستقل بررسی کنید. کد ساده

زیر این الگوی پیشنهادی را بکار می برد.

string ssn = "245-09-8444";

string ssnPatt = @"^(\d{3})-(\d{2})-(\d{4})$";

Match ssnMatch = Regex.Match(ssn, ssnPatt);

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

360

if (ssnMatch.Success){

Console.WriteLine(ssnMatch.Value); // 245-09-8444

Console.WriteLine(ssnMatch.Groups.Count); // 4

// Count is 4 since Groups[0] is set to entire SSN

Console.Write(ssnMatch.Groups[1]); // 245

Console.Write(ssnMatch.Groups[2]); // 09

Console.Write(ssnMatch.Groups[3]); // 8444

}

ما حالا یک الگوی مفیدی داریم که کاراکترهای موقعیت، تکرار و گروه را استفاده کرده است. ابتدا یک الگوی ساده ایجاد

4 را - کردیم، سپس در چندین مرحله آن را بهبود دادیم. این روش معمول ایجاد عبارات منظم پیچیده است. (شکل 20

ببینید).

4- شکل 20

کار با گروه ها

همانطور که در مثال قبلی دیدیم، متن منتج شده از یک تطابق، با قرار دادن بخ شهای یک عبارت در داخل پرانتزها، به طور

اتوماتیک می تواند به زیر رشته ها یا گروه هایی تقسیم شود. متنی که با الگوی داخل پرانتزها تطبیق است، یک عضوی از

می شود. این کلکسیون با یک آرایه از خانهی صفر اندی سگذاری می شود. عنصر صفر برای کل []Match.Groups کلکسیون

تطابق، عنصر 1 برای گروه اول، عنصر 2 برای گروه دوم و غیره هستند.

برای بکارگیری آسان گروه ها می توانید آنها را نام گذاری کنید. نام مورد نظر در داخل پرانتز و بعد از پرانتز باز قرار می گیرد،

است. برای مشاهدهی کاربرد این گرو هها، فرض کنید در یک رشته اسامی هفته و دماهای حداکثر و ؟<name> که گرامر آن

حداقل وجود دارد و می خواهیم آنها را تجزیه کنیم.

string txt ="Monday Hi:88 Lo:56 Tuesday Hi:91 Lo:61";

عبارت منظم این تطبیق دو گروه دارد. روز و دماها. کد زیر یک کلکسیون از تطبیق ها ایجاد می کند و سراسر کلکسیون را

طی می کند و محتوای هر گروه را چاپ م یکند.

string rgPatt = @"(?<day>[a-zA-Z]+)\s*(?<temps>Hi:\d+\s*Lo:\d+)";

MatchCollection mc = Regex.Matches(txt, rgPatt); //Get matches

foreach(Match m in mc)

Console.WriteLine("{0} {1}",

m.Groups["day"],m.Groups["temps"]);

//Output: Monday Hi:88 Lo:56

// Tuesday Hi:91 Lo:61

توجه: بعضی مواقع م یخواهید از پرانتزها برای اهداف دیگری استفاده کنید. برای اینکه اطلاعات داخل پرانتزها به عنوان

منطقی است OR هدف (an|in|on) گرو هبندی در نظر گرفته شود، در داخل پرانتز بعد از پرانتز باز علامت :؟را قرار دهید. در

(an|in|on:?) : و گرو هبندی نیست، پس م ینویسیم

ارجاع به عقب یک گروه

#C فصل بیستم دستکاری متن دز

361

اغلب معمول است یک عبارت منظم ایجاد کنیم که یک تطابق بر اساس نتیجهی تطابق قبلی را شامل است. برای مثال، در

حین کنترل گرامر در پردازشگرهای کلمه، هر کلمه ای را که یک تکرار از کلم ههای قبلی باشند علامت می زنند. می توانیم یک

عبارت منظم برای انجام همین عمل ایجاد کنیم. راز آن تعریف یک گروه برای تطابق یک کلمه و استفاده از کلمه تطبیق شده

به عنوان بخشی از الگو است. برای فهم بیشتر کد زیر را ملاحظه کنید.

string speech = "Four score and and seven years";

patt = @"(\b[a-zA-Z]+\b)\s\1"; // Match repeated words

MatchCollection mc = Regex.Matches(speech, patt);

foreach(Match m in mc) {

Console.WriteLine(m.Groups[1]); // --> and

}

این کد فقط کلمات تکراری را تطبیق م یدهد. عبارت منظم را بررسی کنید.

متن/الگو توصیف

and and

@"(\b[a-zA-Z]+\b)\s

و فضای خالی دنبال می شود را تطبیق (b\) هر کلمه که با مرز یک کلمه

می دهد.

and and

1\

علامت ارجاع به عقب با یک \ که به دنبال آن شماره گروه قرار دارد

مشخص میشود و م یتوان به یک گروه ارجاع کرد. اثر آن درج مقدار

یک گروه تطبیق شده به داخل عبارت است.

است که به دنبال عبارت >k\ به جای شماره گروه می توانید اسم آن را بکار برید. گرامر این نوع ارجاع بصورت > نام گروه

منظم نوشته می شود:

patt = @"(?<word>\b[a-zA-Z]+\b)\s\k<word>";

-3-7-20 مثال هایی از کاربرد عبارات منظم

این بخش یک نگاه سریعی روی بعضی از الگوهای معمول دارد که برای اداره کردن تطبیق الگوهای معمول استفاده می شوند.

باید دو چیز از این مثا لها بفهمید. اینها روش های نامحدودی برای ایجاد عبار تها جهت حل یک مسئله واحد هستند و

بیشتر مسائل تطبیق الگو نکات ظریفی دارند که فوراً آشکار نمی شوند.

برای معکوس کردن کلمات Replace کاربرد

string userName = "Claudel, Camille";

userName = Regex.Replace( userName, @"(\w+),\s*(\w+)", "$2 $1" );

Console.WriteLine(userName); // Camille Claudel

ارجاع به این گرو هها را با قرار Replace عبارت منظم نام اول و آخر را به گرو ههای 1 و 2 انتساب می دهد. پارامتر سوم متد

دادن $ قبل از شماره گروه مجاز می دارد. در این مثال، نام کامل تطبیق شده با کلمات گروه 2 و به دنبال آن گروه 1 جایگزین

می گردد.

پارس کردن اعداد

String myText = "98, 98.0, +98.0, +98";

string numPatt = @"\d+"; // Integer

numPatt = @"(\d+\.?\d*)|(\.\d+)"; // Allow decimal

numPatt = @"([+-]?\d+\.?\d*)|([+-]?\.\d+)"; // Allow + or -

-

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

362

در خط سوم کد، برای پیشنهاد کردن چندین الگو است. در این مثال، وجود یک عدد (|) OR توجه کنید که کاربرد سمبل

اختیاری قبل از نقطه اعشار را مجاز م یدارد.

کد زیر کاراکتر 8 را برای لنگر انداختن الگو به ابتدای خط بکار می برد. عبارت منظم یک گروه چهار بایتی برای تطابق دارد.

نرسیده، گروه تکرار شود. زمانی که این گروه اعمال گردد، آن یک عدد هگزا null کاراکتر ٭ باعث می شود تا زمانیکه به

قرار می گیرد. CaptureCollection دسیمال 4 رقمی را بر می دارد که در شی

string hex = "00AA001CFF0C";

string hexPatt = @"^(?<hex4>[a-fA-F\d]{4})*";

Match hexMatch = Regex.Match(hex,hexPatt);

Console.WriteLine(hexMatch.Value); // --> 00AA001CFFOC

CaptureCollection cc = hexMatch.Groups["hex4"].Captures;

foreach (Capture c in cc)

Console.Write(c.Value); // --> 00AA 001C FF0C

را نشان می دهد CaptureCollection و GroupCollection ,Match 5 رابطهی سلسله مراتبی مابین - شکل 5

5- شکل 20

-8-20 خلاصه

معرفی شدند، تقاضا برای کار با کاراکترها افزایش یافت. ANSI یا ASCII • از زمانیکه کاراکترهای 7بیتی

این استاندارد را با کاراکترهای NET. • امروزه یونیکد استاندارد نمایش بیش از 90000 کاراکتر را تعریف میکند. که

16 بیتی میپوشاند.

مفهوم محلی کردن را پشتیبانی میکند، یعنی رعایت اطلاعات فرهنگ ماشین محلی را تضمین میکند. NET. •

فراهم NET. در StringBuilder و String • ادارهکردن رشتهها با یک مجموعهی غنی از متدهای کلاسهای

شده است.

متدهای متنوعی برای مقایسهی رشتهها موجود است که حالت حروف و فرهنگ را در صورت نیاز در نظر میگیرند.

برای فرمتدهی نمایش اعداد، رشتهها، تاریخ و واحد پول و غیره استفاده میشود. String.Format • متد

استفاده StringBuilder • دستکاری رشتهها حافظه را زیاد مصرف میکنند، برای کاربرد کارای حافظه از کلاس

میکنند.

استفاده کرد. Regex • برای تطابق الگوها و پارس کردن رشتهها میتوان از کلاس

mohsen_mahyar@yahoo.com - C#   نویسی برنامه

 

   + MOHSEN GHASEMI - ۱٠:٥٠ ‎ب.ظ ; ۱۳۸٩/٤/٢۸