کار با عبارت های منظم در سوئیفت - بخش اول

کار با عبارت های منظم در سوئیفت - بخش اول

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

1. عبارت های منظم در سوئیفت

Xcode را باز کنید و یک Playground جدید به نام RegExTut بسازید و پلتفرم را هم به OS X ست کنید. انتخاب iOS یا OS X برای پلتفرم فرقی نمی کند چرا که API مورد استفاده برای هر دوی آنها عملکرد یکسانی دارد.

blog_20286_1

در سوئیفت باید از دو \\ به جای هر \ استفاده شده در عبارت منظم بهره بگیرید، زیرا سوئیفت دارای سبک لفظی مشابه سی است. بک اسلش علاوه بر نقش آن در الحاق رشته در سوئیفت، به عنوان یک کاراکتر اسکیپ پردازش می شود، به بیان دیگر باید کاراکتر اسکیپ را رد کنید. شاید هنوز هم این موضوع برای شما کمی سردرگم کننده باشد، اما این موضوع را به خاطر سپارید که باید به جای یک بک اسلش دو بک اسلش را مورد استفاده قرار دهید.

در اولین مثال فرض می کنیم که در رشته موردنظر به دنبال یک نوع بسیار خاص از آدرس ایمیل هستیم که دارای شرایط زیر است:

- حرف اول رشته حرف اول نام شخص است.

- یک نقطه پس از آن آمده است.

- نام خانوادگی شخص پس از آن آمده است.

- کاراکتر @ پس از آن ظاهر شده است.

- پس از آن یک نام که نشان دهند یک دانشگاه در انگلستان است می آید.

- پس از آن ac.uk. که دامین موسسات آکادمیک در انگلستان است قرار می گیرد.

کد زیر را به playground اضافه کنید، حال گام به گام به نحوه عملکرد این قطعه کد می پردازیم.

import Cocoa

// (1):

let pat = "\\b([a-z])\\.([a-z]{2,})@([a-z]+)\\.ac\\.uk\\b"

// (2):

let testStr = "x.wu@strath.ac.uk, ak123@hotmail.com e1s59@oxford.ac.uk, ee123@cooleng.co.uk, a.khan@surrey.ac.uk"

// (3):

let regex = try! NSRegularExpression(pattern: pat, options: [])

// (4):

let matches = regex.matchesInString(testStr, options: [], range: NSRange(location: 0, length: testStr.characters.count))

گام 1

ما یک الگو را تعریف کرده ایم، به بک اسلش های دوگانه توجه کنید. در عبارت های منظم معمولی مانند آنچه در وب سایت RegExr استفاده شده، این عبارت به شکل a-z])\.([a-z]{2,})@([a-z]+)\.ac\.uk]) می آید. به کاربرد پرانتزها در عبارت منظم توجه کنید، این پرانتزها برای تعریف کپچر گروپ ها مورد استفاده قرار می گیرند و با کمک آنها می توانیم زیررشته هایی را که با بخشی از عبارت منظم مطابقت دارند بیرون بکشیم.

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

گام 2

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

گام 3

ما یک آبجکت NSRegularExpression می سازیم و الگو را بدون آپشن ارسال می کنیم. در لیست گزینه ها می توانید ثابت های NSRegularExpressionOption مانند زیر مشخص کنید:

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

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

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

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

گام 4

با اجرای (:matchsInString ( _:options:range در رشته به دنبال تطبیق هایی می گردیم و در قسمت range باید بخشی از رشته را که مورد نظر ماست قرار دهیم. این متد چندین گزینه را نیز می پذیرد، اما برای سادگی کار هیچ گزینه ای را در این مثال ارسال نمی کنیم و در مثال بعدی به آن خواهیم پرداخت.

تطبیق ها به صورت یک آرایه از آبجکت های NSTextCheckingResult برگردانده می شود و می توانیم تطبیق ها را استخراج کنیم، برای نمونه کپچر گروپ ها مانند زیر:

for match in matches {

for n in 0..<match.numberOfRanges {

let range = match.rangeAtIndex(n)

let r = testStr.startIndex.advancedBy(range.location) ..<

testStr.startIndex.advancedBy(range.location+range.length)

testStr.substringWithRange(r)

}

}

قطعه کد بالا در هر آبجکت NSTextCheckingResult در آرایه پیمایش می کند. ویژگی numberOfRanges برای هر تطبیق در این مثال دارای مقدار 4 است. یکی از آنها برای کل زیررشته که مطابق با آدرس ایمیل مربوطه است و سه تطبیق دیگر برای سه کپچر گروپ در داخل تطبیق.

متد (:_)rangeAtIndex یک محدوده از زیررشته ها در رشته را برمی گرداند و می توانیم آنها را استخراج کنیم، به جای استفاده از (rangeAtIndex(0 می توانید از ویژگی range برای کل تطبیق نیز استفاده نمایید.

بر روی دکمه Show Result در پنل نتایج در قسمت راست کلیک کنید، این کار Surrey یعنی مقدار (testStr.substringWithRange(r را برای آخرین تکرار حلقه نشان می دهد.

با کلیک راست بر روی فیلد نتایج و انتخاب Value History می توانید تاریخچه مقادیر را مشاهده کنید.

blog_20286_2

شما می توانید کد بالا را تغییر دهید تا عملیات بامعنایی با تطبیق ها یا کپچر گروپ ها انجام دهد.

راه آسانی برای اجرای عملیات یافتن و جایگزین کردن وجود دارد، این کار از طریق یک رشته الگو که دارای یک سینتکس خاص جهت نمایش کپچر گروپ است انجام می شود. تصور کنید که می خواهیم تمامی تطبیق های آدرس ایمیل را با یک زیر رشته به فرم lastname, initial, university جایگزین کنیم، برای این کار به این صورت عمل می کنیم:

let replacedStr = regex.stringByReplacingMatchesInString(testStr, 

options: [],

range: NSRange(location: 0, length: testStr.characters.count),

withTemplate: "($2, $1, $3)")

به سینتکس n$ در الگو توجه کنید که در نقش پلیس هولدر برای متن کپچر گروپ n ظاهر می شود. به خاطر داشته باشید که 0$  نمایش دهنده کل تطبیق است.

در مطلب آینده به شرح مثال دیگری خواهیم پرداخت که کار با عبارت های منظم را به شکل واضح تری به نمایش خواهد گذاشت، با ما همراه باشید.

 

http://code.tutsplus.com برگرفته از

اینها را هم بخوانید