فهرست مطالب
در این آموزش، نگاهی عمیق به نحوه استفاده از regex برای تطبیق رشته ها در اکسل خواهیم داشت.
زمانی که نیاز دارید مقدار خاصی را در یک محدوده پیدا کنید. از سلول ها، از تابع MATCH یا XMATCH استفاده می کنید. هنگامی که به دنبال یک رشته خاص در یک سلول هستید، توابع FIND و SEARCH مفید هستند. و چگونه می توان فهمید که یک سلول حاوی اطلاعاتی است که با یک الگوی داده شده مطابقت دارد؟ بدیهی است که با استفاده از عبارات منظم. اما خارج از جعبه اکسل از regexes پشتیبانی نمی کند! نگران نباشید، ما آن را مجبور می کنیم :)
عملکرد Excel VBA Regex برای مطابقت با رشته ها
همانطور که از عنوان کاملا مشخص است، به منظور استفاده از عبارات منظم در اکسل، باید تابع خود را ایجاد کنید. خوشبختانه، VBA اکسل دارای یک شی داخلی RegExp است که می توانید از آن در کد خود مانند شکل زیر استفاده کنید:
تابع عمومی RegExpMatch(input_range به عنوان محدوده، الگوی به عنوان رشته، اختیاری match_case به عنوان Boolean = True) به عنوان Variant Dim arRes() به عنوان آرایه متغیر برای ذخیره نتایج: Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols به عنوان طولانی 'شاخص ردیف فعلی در محدوده منبع، نمایه ستون فعلی در محدوده منبع، تعداد ردیف ها، تعداد سطرها ستونها روی خطا برو به ErrHandl RegExpMatch = arRes تنظیم regex = CreateObject ("VBScript.RegExp") regex.pattern = الگوی regex.Global = True regex.MultiLine = True If True = match_case سپس regex.Eignorecase regex = True. پایانعبارات.الگو : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\- ]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
برای درک بهتر اینکه اینجا چه خبر است، اجازه دهید نگاهی دقیقتر به هر قسمت بیندازیم. :
- نام کاربری ممکن است شامل حروف، اعداد، زیرخط، نقطه و خط فاصله باشد. با توجه به اینکه \w با هر حرف، رقم یا زیرخط مطابقت دارد، رجکس زیر را دریافت می کنیم: [\w\.\-]+
- نام دامنه ممکن است شامل حروف بزرگ و کوچک باشد. ارقام، خط تیره (اما نه در موقعیت اول یا آخر) و نقطه (در مورد زیر دامنه). از آنجایی که زیرخط مجاز نیست، به جای \w از 3 مجموعه کاراکتر مختلف استفاده می کنیم: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
- دامنه سطح بالا از یک نقطه به دنبال حروف بزرگ و کوچک تشکیل شده است. می تواند از 2 تا 24 حرف (طولانی ترین TLD موجود در حال حاضر) داشته باشد: \.[A-Za-z]{2,24}
توجه. الگو فرض می کند که نام دامنه شامل 2 یا چند کاراکتر الفبایی عددی است.
با متن اصلی در A5 و الگوی A5، فرمول این شکل را به خود می گیرد:
=RegExpMatch(A5, $A$2)
یا می توانید از یک معمولی ساده تر استفاده کنید عبارت برای اعتبارسنجی ایمیل با مجموعه نویسههای کوچک یا بزرگ:
Pattern : \b[\w\.\-]+@[a-z0-9]+[a- z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
اما فرمول خود را به حروف بزرگ و کوچک حساس کنید:
=RegExpMatch(A5, $A$2, FALSE)
فرمول Excel IF با match regex
با توجه به اینکه داخلی و سفارشیتوابع به خوبی پیش می روند، هیچ چیزی نمی تواند مانع استفاده از آنها در یک فرمول واحد شود.
برای برگرداندن یا محاسبه چیزی اگر یک عبارت معمولی مطابقت دارد و چیز دیگری اگر مطابقت ندارد، RegExpMatch سفارشی را جاسازی کنید. تابع در متن منطقی IF:
IF(RegExpMatch(...)، [value_if_true]، [value_if_false])به عنوان مثال، اگر رشته ای در A5 حاوی یک آدرس ایمیل معتبر باشد، می توانید "بله" را برگردانید. در غیر این صورت "نه".
=IF(RegExpMatch(A5, $A$2,), "Yes", "No")
اگر regex مطابقت دارد شمارش کنید
از آنجا که توابع اکسل بومی از عبارات منظم پشتیبانی نمی کنند، امکان قرار دادن یک regex به طور مستقیم در تابع COUNTIS یا COUNTIFS وجود ندارد. خوشبختانه، میتوانید این عملکرد را با استفاده از تابع سفارشی ما شبیهسازی کنید.
فرض کنید از یک regex برای مطابقت با شماره تلفنها و خروجی نتایج در ستون B استفاده کردهاید. برای اینکه بفهمید چند سلول حاوی شماره تلفن هستند، فقط باید برای شمارش مقادیر TRUE در B5:B9. و این را می توان به راحتی با استفاده از فرمول استاندارد COUNTIF انجام داد:
=COUNTIF(B5:B9, TRUE)
آیا هیچ ستون اضافی در کاربرگ خود نمی خواهید؟ مشکلی نیست. با توجه به اینکه تابع سفارشی ما میتواند چندین سلول را در یک زمان پردازش کند و SUM اکسل میتواند مقادیر را در یک آرایه اضافه کند، کاری که انجام میدهید این است:
- یک مرجع محدوده به RegExpMatch ارائه دهید، بنابراین یک عدد را برمیگرداند. آرایه ای از مقادیر TRUE و FALSE.
- از یک نفی مضاعف (--) برای وادار کردن مقادیر منطقی به یک ها استفاده کنید وصفرها.
- برای جمع کردن 1 و 0 در آرایه حاصل، تابع SUM را دریافت کنید.
=SUM(--RegExpMatch(A5:A9, $A$2))
تطابق Reex با Ultimate Suite
کاربران Ultimate Suite ما میتوانند از چهار عملکرد قدرتمند Regex بدون افزودن کد VBA به کتابهای کاری خود استفاده کنند، زیرا در طول نصب افزونه به راحتی در Excel ادغام میشوند. توابع سفارشی ما توسط موتور استاندارد .NET RegEx پردازش می شوند و از عبارات منظم کلاسیک با ویژگی های کامل پشتیبانی می کنند.
نحوه استفاده از تابع سفارشی RegexMatch
با فرض اینکه آخرین نسخه Ultimate Suite را نصب کرده اید ( 2021.4 یا بالاتر)، می توانید یک فرمول Regex Match را در دو مرحله ساده ایجاد کنید:
- در برگه Ablebits Data ، در گروه Text ، کلیک کنید. Regex Tools .
- انتخاب کنید رشته های منبع.
- الگوی خود را وارد کنید.
- گزینه Match را انتخاب کنید.
- برای اینکه نتایج به عنوان فرمول باشد، نه مقادیر، <را انتخاب کنید 8>درج به عنوان یک فرمول کادر علامت بزنید.
- دکمه Match را کلیک کنید.
لحظه ای بعد، تابع AblebitsRegexMatch در ستون جدیدی در سمت راست داده های شما درج می شود.
در تصویر زیر، تابع بررسی می کند که آیا رشته های ستون A دارای 7 رقم هستند یا خیر. اعداد یا نه.
نکات:
- کارکرد tion را می توان درج مستقیم در یک سلول از طریق کادر محاوره ای استاندارد Insert Function ، که در آن تحت AblebitsUDFs طبقه بندی می شود.
- به طور پیش فرض، یک عبارت منظم به فرمول اضافه می شود، اما می توانید آن را نیز نگه دارید آن را در یک سلول جداگانه برای این کار، فقط از یک مرجع سلول برای آرگومان دوم استفاده کنید.
- به طور پیش فرض، تابع حساس به حروف کوچک و بزرگ است . برای تطبیق غیرحساس به حروف بزرگ، از الگوی (?i) استفاده کنید.
برای اطلاعات بیشتر، لطفاً تابع AblebitsRegexMatch را ببینید.
این نحوه انجام تطبیق عبارات معمولی در اکسل است. از شما سپاسگزارم که خواندید و مشتاقانه منتظر دیدار شما در وبلاگ ما در هفته آینده هستم!
دانلودهای موجود
نمونههای Excel Regex Match (فایل xlsm.)
Ultimate Suite 14- نسخه کاملاً کاربردی روز (فایل exe)
اگر cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 به cntInputRows، 1 به cntInputCols) برای iInputCurRow = 1 به cntInputRows برای iInputCurlsCol = 1 به cntInputRows برای iInputCurlsCol = 1 به cntInputRows برای iInputCurlsCols. .Cells(iInputCurRow, iInputCurCol).Value) بعد بعدی RegExpMatch = arRes عملکرد خروج ErrHandl: RegExpMatch = CVERr(xlErrValue) عملکرد پایان کد را در ویرایشگر VBA جایگذاری کنید و تابع جدید RegMatch
توجه داشته باشید. پس از درج کد، به یاد داشته باشید که فایل خود را به عنوان یک کتاب کار با ماکرو فعال (xlsm.) ذخیره کنید.
نحو RegExpMatch
عملکرد RegExpMatch بررسی می کند که آیا هر بخشی از رشته منبع با یک عبارت منظم مطابقت دارد یا خیر. نتیجه یک مقدار بولی است: اگر حداقل یک تطابق پیدا شود درست است، در غیر این صورت نادرست است.
عملکرد سفارشی ما دارای 3 آرگومان است - دو آرگومان اول مورد نیاز و آخرین مورد اختیاری است:
RegExpMatch(text , pattern, [match_case])Where:
- Text (الزامی) - یک یا چند رشته برای جستجو. می توان به عنوان مرجع سلول یا محدوده ارائه شود.
- الگو (الزامی) - عبارت منظم برای مطابقت. هنگامی که یک الگو مستقیماً در یک فرمول قرار می گیرد، یک الگو باید در گیومه های دوتایی محصور شود.
- Match_case (اختیاری) - مطابقت را مشخص می کند.نوع اگر TRUE یا حذف شده باشد (پیشفرض)، تطبیق حساس به حروف بزرگ انجام میشود. اگر FALSE - به حروف بزرگ و کوچک حساس نیست.
این تابع در همه نسخههای Excel 365، Excel 2021، Excel 2019، Excel 2016، Excel 2013 و Excel 2010 کار میکند.
3 مورد شما باید در مورد RegExpMatch بدانید
قبل از رسیدن به محاسبات عملی، لطفاً به نکات زیر توجه کنید که برخی از نکات فنی را روشن می کند:
- این تابع می تواند یک تک سلول را پردازش کند یا محدوده سلول ها . در حالت دوم، نتایج در سلولهای مجاور به شکل یک آرایه پویا یا محدوده ریزش برگردانده میشوند، همانطور که در این مثال نشان داده شده است.
- به طور پیشفرض، تابع حساس به حروف کوچک و بزرگ است . برای نادیده گرفتن حروف متن، آرگومان match_case را روی FALSE تنظیم کنید. به دلیل محدودیت های VBA Regexp، الگوی حساس به حروف بزرگ (?i) پشتیبانی نمی شود.
- اگر یک الگوی معتبر یافت نشد، تابع FALSE را برمیگرداند. اگر الگو نامعتبر باشد ، یک #VALUE! خطا رخ می دهد.
در زیر، چند نمونه تطبیق regex را خواهید دید که برای اهداف نمایشی ایجاد شده اند. ما نمیتوانیم تضمین کنیم که الگوهای ما با گستره وسیعتری از دادههای ورودی در کاربرگهای واقعی شما بدون نقص کار میکنند. قبل از شروع تولید، حتما الگوهای نمونه ما را مطابق با نیاز خود آزمایش و تنظیم کنید.
نحوه استفاده از regex برای مطابقت دادن رشته ها در اکسل
وقتی همه رشته هایی که می خواهید مطابقت داشته باشند دارای همان الگو،عبارات منظم یک راه حل ایده آل هستند.
فرض کنید شما محدوده ای از سلول ها (A5:A9) حاوی جزئیات مختلف در مورد برخی موارد دارید. می خواهید بدانید کدام سلول ها دارای SKU هستند. با فرض اینکه هر SKU از 2 حرف بزرگ، یک خط فاصله و 3 رقم تشکیل شده است، می توانید آنها را با استفاده از عبارت زیر مطابقت دهید.
Pattern : \b[A-Z]{2}-\ d{3}\b
که در آن [A-Z]{2} به معنای هر 2 حرف بزرگ از A تا Z و \d{3} به معنای هر 3 رقم از 0 تا 9 است. کاراکتر \b یک کلمه را نشان میدهد. boundary، به این معنی که SKU یک کلمه جداگانه است و بخشی از یک رشته بزرگتر مانند 23-MAR-2022 نیست.
با الگوی ایجاد شده، می توانیم به نوشتن یک فرمول برویم. اساساً، استفاده از یک تابع سفارشی با تابع اصلی تفاوتی ندارد. به محض اینکه شروع به تایپ فرمول کنید، نام تابع در لیست پیشنهاد شده توسط تکمیل خودکار اکسل ظاهر می شود. با این حال، چند تفاوت در اکسل آرایه پویا (مایکروسافت 365 و اکسل 2021) و اکسل سنتی (نسخه های 2019 و قدیمی تر) وجود دارد.
تطبیق رشته در یک سلول
برای مطابقت با یک رشته در یک سلول، در آرگومان اول به آن سلول مراجعه کنید. آرگومان دوم قرار است حاوی یک عبارت منظم باشد.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
این الگو همچنین می تواند در یک سلول از پیش تعریف شده نگهداری شود که با یک مرجع مطلق قفل شده است ($A$2):
=RegExpMatch(A5, $A$2)
پس از وارد کردن فرمول در سلول اول، میتوانید آن را به تمام ردیفهای دیگر به پایین بکشید.
این روشدر همه نسخههای اکسل به زیبایی کار میکند.
تطبیق رشتهها در چندین سلول در یک زمان
برای تطبیق چندین رشته با یک فرمول، یک مرجع محدوده را در آرگومان اول قرار دهید:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
در Excel 365 و Excel 2021 که از آرایه های پویا پشتیبانی می کنند، به این ترتیب کار می کند - فرمول را در سلول اول تایپ میکنید، Enter را فشار میدهید و فرمول به طور خودکار در سلولهای زیر ریخته میشود.
در Excel 2019 و قبل از آن، فقط به عنوان یک فرمول سنتی آرایه CSE کار می کند، که در محدوده ای از سلول ها وارد می شود و با فشار دادن کلیدهای Ctrl + Shift + Enter با هم تکمیل می شود.
Regex برای مطابقت با شماره
برای مطابقت با هر رقمی از 0 تا 9، از کاراکتر \d در regex استفاده کنید. بسته به وظیفه خاص خود، یک کمیت مناسب اضافه کنید یا یک الگوی پیچیده تر ایجاد کنید.
Regex برای مطابقت با هر عدد
برای مطابقت با هر عددی با هر طول، کمیت + را درست بعد از / قرار دهید. کاراکتر d، که میگوید به دنبال اعداد حاوی 1 یا چند رقم بگردید.
Pattern : \d+
=RegExpMatch(A5:A9, "\d+")
Regex برای مطابقت با تعداد با طول خاص
اگر هدف شما مطابقت دادن مقادیر عددی حاوی تعداد معینی از رقم است، سپس از \d همراه با یک کمیت مناسب استفاده کنید.
به عنوان مثال، برای مطابقت با شماره های فاکتور که دقیقاً از 7 رقم تشکیل شده است، از \d{7} استفاده می کنید. با این حال، لطفاً به خاطر داشته باشید که با 7 مطابقت داردهمانطور که انتظار می رود:
نکات:
- کدهای بین المللی بررسی نمی شوند، بنابراین ممکن است وجود داشته باشند یا نباشند.
- در عبارات منظم، \s مخفف هر کاراکتر فضای خالی مانند فاصله، برگه، بازگشت بار یا خط جدید است. برای اجازه دادن فقط فاصله، از [-\ استفاده کنید. ] به جای [-\.\s].
- [^13] با هر کاراکتری که 1 یا 3 نباشد مطابقت خواهد داشت. 2 یا 3 (یعنی هر رقمی از 1 تا 3).
- regex فوق فقط برای رشته های تک خطی کار می کند. در مورد رشته های milti-line، کاراکترهای ^ و $ با ابتدا و انتهای هر خط به جای شروع و پایان رشته ورودی مطابقت دارند، بنابراین regex فقط در خط اول جستجو می کند.
- برای مطابقت دادن رشته هایی که با متن خاصی شروع نمی شوند ، از یک عبارت منظم مانند ^(?!lemons) استفاده کنید.*$
- برای تطبیق رشته هایی که به متن خاصی ختم نمی شوند ، شامل شودرشته انتهایی به الگوی جستجو متصل می شود: ^((?!lemon$).)*$
Regex برای NOT مطابق کاراکتر
برای یافتن رشته هایی که حاوی یک کاراکتر خاص نیستند، می توانید از کلاس های کاراکترهای نفی شده [^ ] که مطابقت دارند استفاده کنید. هر چیزی که در پرانتز نباشد برای مثال:
در فهرستی از شمارههای تلفن، فرض کنید میخواهید شمارههایی را بیابید که کد کشور ندارند. با توجه به اینکه هر کد بینالمللی شامل علامت + است، میتوانید از کلاس کاراکتر [^\+] برای یافتن رشتههایی که حاوی علامت مثبت نیستند استفاده کنید. توجه به این نکته مهم است که عبارت فوق با هر کاراکتری که + نباشد مطابقت دارد. از آنجایی که یک شماره تلفن می تواند در هر جایی از یک رشته باشد، نه لزوما در همان ابتدا، کمیت * برای بررسی هر کاراکتر بعدی اضافه می شود. لنگرهای start ^ و end $ تضمین می کنند که کل رشته پردازش می شود. در نتیجه، عبارت منظم زیر را دریافت میکنیم که میگوید "کاراکتر + را در هیچ موقعیتی در رشته مطابقت نداشته باشید".
Pattern :^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex برای NOT مطابق با رشته
اگرچه هیچ نحو عبارت منظم خاصی برای با یک رشته خاص مطابقت ندارد، میتوانید با استفاده از یک نگاه منفی این رفتار را شبیهسازی کنید.
فرض کنید میخواهید رشتههایی را پیدا کنید که شامل کلمه "lemon" نباشند. این عبارت با قاعده به خوبی کار خواهد کرد:
Pattern : ^((?! لیموها).)*$
بدیهی است که در اینجا به توضیحی نیاز است. نگاه منفی (؟! لیموها) به سمت راست نگاه می کند تا ببیند آیا کلمه "لیمو" در جلو وجود ندارد. اگر «لیموها» وجود نداشته باشد، نقطه با هر کاراکتری به جز شکست خط مطابقت دارد. عبارت بالا فقط یک بررسی را انجام می دهد و کمیت کننده * آن را صفر یا چند بار تکرار می کند، از ابتدای رشته لنگر شده توسط ^ تا انتهای رشته لنگر شده توسط $.
برای نادیده گرفتن حروف متن، ما آرگومان سوم را روی FALSE قرار دادیم تا تابع خود را به حروف بزرگ و کوچک حساس کنیم:
=RegExpMatch(A5, $A$2, FALSE)
نکات و نکات:
تطبیق غیر حساس به حروف کوچک و کوچک
در عبارات منظم کلاسیک، الگوی خاصی برای تطبیق حساس به حروف بزرگ (?i)، که در VBA RegExp پشتیبانی نمی شود. برای غلبه بر این محدودیت، تابع سفارشی ما سومین آرگومان اختیاری با نام match_case را می پذیرد. برای انجام تطبیق بدون حساس به حروف بزرگ، به سادگی آن را روی FALSE تنظیم کنید.
فرض کنید میخواهید تاریخهایی مانند 1-Mar-22 یا 01-MAR-2022 را شناسایی کنید. برای مطابقت با قالبهای dd-mmm-yyyy و d-mmm-yyyy ، از عبارت منظم زیر استفاده میکنیم.
Pattern : \b\d{1،2}-(ژانویهارقام در هر نقطه از رشته شامل یک عدد 10 رقمی یا 100 رقمی. اگر این چیزی نیست که به دنبال آن هستید، کلمه مرز \b را در هر دو طرف قرار دهید.
Pattern : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex برای مطابقت با شماره تلفنها
از آنجایی که شماره تلفنها را میتوان در قالبهای مختلف نوشت، تطبیق آنها به عبارت منظم پیچیدهتری نیاز دارد.
در مجموعه داده زیر، ما به دنبال اعداد 10 رقمی خواهیم بود که در 2 گروه اول 3 رقم و در گروه آخر 4 رقم دارند. گروه ها را می توان با نقطه، خط تیره یا فاصله از هم جدا کرد. گروه اول ممکن است داخل پرانتز باشد یا نباشد.
الگو: (\(\d{3}\)