حسین کعبی: وقتی فیگو را در جام جهانی زدم....
همانطور که گفتیم در زبانهای مختلف عبارات با قاعده وجود دارد که قدری با یکدیگر متفاوتند. در این شماره عبارت با قاعده را در
net. مورد بررسی قرار میدهیم و مطالب را مثال به مثال بررسی میکنیم.میخواهیم یک کلمه را با یک کلمه دیگر مقایسه کنیم؛ به طور مثال میخواهیم ببینم کلمه ورودی کاربر click بودهاست.
برای این کار عبارت باقاعده زیر را مینویسیم.
bclick\b\ کاراکتر b\ ابتدا و انتهای یک رشته را مشخص میکند و اگر بیشتر بود، آن را بررسی نمیکند.
میخواهیم بررسی کنیم که ورودی ما فقط یک عدد ۲ رقمی باشد ؛ پس به صورت زیر مینویسیم:
b\d\d\b\، کاراکتر d\ نمایش دهنده یک رقم عدد است. دقت داشته باشید که این الگو یک عدد دو رقمی را بررسی میکند، اما اگر مقدار رشته ورودی 22 th، باشد مقدار ۲۲ را درست و مقدار بعدی یعنی th را اشتباه تشخیص میدهد. البته شما با استفاده از متد Regex.Matches تمامی مشابهات را از یک متن خارج کنید، به فرض در همین مثال بالا شما میتوانید فقط مقدار 22 را خروجی بگیرید، اما در مثال ما این مورد خیلی کاربردی نیست. حال چه کاری باید انجام دهیم که مقدار خروجی، دقیق و درست باشد؟
دو نشانه دیگر وجود دارد، یکی &~#@& و دیگری $ اولی ابتدای رشته و دومی انتهای رشته را مشخص میکند. پس تفاوت آن با b\ در چیست؟ در b\ اگر شما کاراکتر یا رشتهای بعد از مقدار ورودی داشته باشید نیز بررسی میشود ؛ ولی با استفاده از این دو کاراکتر رشته ورودی باید عینا با الگو شما یکسان باشد، نه کمتر نه بیشتر. همان مثال بالا را این گونه بازنویسی میکنیم.
&~#@&\d\d$ اگر شما به این الگو مقدار 22th را بدهید، رشته ورودی با الگو معتبر نیست، فقط باید عبارت ۲۲ را به آن بدهید.
حالا میخواهیم یک رشته متنی را مقایسه کنیم که فقط ۲ کاراکتر باشد و با حرف c آغاز شود.برای این منظور الگوی زیر را استفاده میکنیم.
a\w$ &~#@& الگوی زیر فقط عبارتهای aa یا a2 یا ax را معتبر میداند، پس حتما باید رشته ورودی شما با حرف a شروع شود مهم نیست کاراکتر بعد از آن چه چیزی باشد، فقط باید یک کاراکتر باشد.
حال قدری الگوهای بالا را بهتر کنیم. در مثال دوم همان طور که بیان شد دنبال یک رشته 2 رقمی عدد میگشتیم، اما اگر ۱۰ کاراکتر مد نظر ما بود، باید ۱۰ تا d \ بنویسیم؟
جواب خیر است، میتوانیم از {} استفاده کنیم، برای استفاده از {} ما 3 گزینه داریم که به ترتیب آنها را بیان میکنیم.
{10} فقط ۱۰ بار تکرار شود نه بیشتر نه کمتر.
10{،}20 حداقل ۱۰ بار وجود داشته باشد و بیشتر از ۲۰ بار تکرار نشود.
10 {،} حداقل ۱۰ بار تکرار شود، بیشتر از آن مهم نیست.
برای مثال الگویb \{4.5}b\w\ دنبال رشتههای ۴ یا ۵ کاراکتری در متن میگردد، یا همان مثال بالا به صورت زیر میتوان باز نویسی کرد
${2}d\&~#@& یعنی دو کاراکتر عددی.در تمامی حالات بالا مشخص بود که حداقل چند کاراکتر باید وجود داشته باشد، اما راههای سادهتری برای نشان دادن این موضوع وجود دارد. کاراکترهای زیر را بررسی میکنیم.
کاراکتر *، نشاندهنده این است که به هر تعداد کاراکتر میخواهد وجود داشته باشد، تعداد آن مهم نیست.
کاراکتر +، حداقل یک بار وجود داشته باشد.
کاراکتر ؟، یا اصلا رخ ندهد، یا یک بار رخ دهد.
تا اینجا با چند کاراکتر مختلف آشنا شدیم که متن را با الگوی مشخص شده مقایسه میکند. برای مثال کاراکتر $ یا &~#@& را در نظر بگیرید، اگر بخواهیم بررسی کنیم که این کاراکترها در متن وجود دارد یا خیر، چه کاری باید انجام دهیم؟
کاراکتر \ را در زبانهای برنامهنویسی به یاد بیاورید، به این کاراکتر یک Escaped Character گفته میشود، یعنی هر کاراکتر بعد از آن بدون معنای اصلی آن در نظر میگیرد، به طور مثال مقدار عبارت \click\ برابر click است، یعنی کاراکتر اول و دوم که هستند، Escaped میشوند و آنها را در نظر نمیگیرند، در عبارت با قاعده نیز به همین صورت است. به عنوان مثال:
&~#@&\w\ مقدار یک کاراکتر که بعد از آن &~#@& باشد را بررسی میکند.
در بالا همان طوری که توضیح داده شد کاراکتر w\ برای یک کاراکتر عدد/حرف است ؛ اما برای بر قرار نبودن این شرط از W\ استفاده میکنیم، به طور مثال b\W\b\ یعنی کاراکتر مورد نظر نباید یک کاراکتر عدد/حرف است. همین قضیه برای \D و \B نیز صادق است که نقیض d\ و b\ هستند.
حالا میخواهیم بررسی کنیم که متن شامل یک کاراکتر خاص نباشد، [&~#@&a] یعنی کاراکتر مورد نظر a نباشد، یا [click&~#@&] یعنی رشته مورد نظر برابر click نباشد.
دو کاراکتر دیگر را بررسی میکنیم، اولی | است که بین دو الگو شرط میگذارد که یکی از این دو شرط باید برقرار باشد. کاراکتر دیگر () است که برای دستهبندی استفاده میشود، به طور مثال برای بررسی نشانی IP به صورت زیر عمل میکنیم:
(\d{1,3}\.){3}\d{1,3}
حسین کعبی: وقتی فیگو را در جام جهانی زدم....