فهرست مطالب
در این آموزش، نحوه استفاده از عبارات منظم در اکسل برای یافتن و استخراج زیررشته های مطابق با یک الگوی داده شده را خواهید آموخت.
Microsoft Excel تعدادی توابع برای استخراج متن ارائه می کند. از سلول ها این توابع می توانند با اکثر چالش های استخراج رشته در کاربرگ های شما مقابله کنند. بیشتر، اما نه همه. هنگامی که توابع Text دچار مشکل می شوند، عبارات منظم کمک می کنند. صبر کنید... اکسل هیچ توابع RegEx ندارد! درست است، هیچ توابع داخلی وجود ندارد. اما چیزی وجود ندارد که شما را از استفاده از ابزارهای خود باز دارد :)
عملکرد Excel VBA Regex برای استخراج رشته ها
برای افزودن یک تابع Regex Extract سفارشی به اکسل خود، کد زیر را در ویرایشگر VBA قرار دهید. برای فعال کردن عبارات منظم در VBA، ما از شی RegExp داخلی Microsoft استفاده می کنیم.
تابع عمومی RegExpExtract(متن به عنوان رشته، الگوی به عنوان رشته، نمونه اختیاری_num به عنوان عدد صحیح = 0، اختیاری match_case به عنوان Boolean = True) کم نور text_matches() به عنوان رشته کم نور matches_index به عنوان عدد صحیح در خطا برو به ErrHandl RegExpExtract = "" تنظیم regex = CreateObject ("VBScript.RegExp") regex.pattern = الگوی regex.Global = True regex.MultiLine match = Truege. ignorecase = False Else regex.ignorecase = پایان واقعی اگر Set مطابقت دارد = regex.Execute(text) اگر 0 < matches.Count سپس If (0 = instance_num) سپس ReDim text_matches(matches.Count - 1, 0) برای matches_index = 0 toVBA RegExp، من شما را تشویق می کنم که قسمت بعدی را بخوانید که در مورد توابع Regex دات نت قدرتمندتر بحث می کند.عملکرد Regex مبتنی بر دات نت سفارشی برای استخراج متن در اکسل
بر خلاف توابع VBA RegExp که می تواند توسط هر کاربر اکسل نوشته شود، NET RegEx قلمرو توسعه دهنده است. مایکروسافت دات نت فریم ورک از سینتکس عبارت منظم با ویژگی های کامل و سازگار با Perl 5 پشتیبانی می کند. این مقاله به شما یاد نمی دهد که چگونه چنین توابعی را بنویسید (من یک برنامه نویس نیستم و کوچکترین ایده ای در مورد نحوه انجام آن ندارم :)
چهار عملکرد قدرتمند پردازش شده توسط موتور استاندارد .NET RegEx قبلاً توسط توسعه دهندگان ما نوشته شده و در Ultimate Suite گنجانده شده است. در زیر، برخی از کاربردهای عملی این تابع را که مخصوص استخراج متن در اکسل طراحی شده است، نشان خواهیم داد.
نکته. برای اطلاعات در مورد نحو Regex دات نت، لطفاً به زبان بیان منظم دات نت مراجعه کنید.
نحوه استخراج Stings در اکسل با استفاده از عبارات معمولی
با فرض اینکه آخرین نسخه Ultimate Suite را نصب کرده اید، استخراج متن با استفاده از عبارات منظم به این دو مرحله خلاصه می شود:
- در برگه Ablebits Data ، در گروه Text ، روی Regex Tools کلیک کنید.
- در صفحه Regex Tools ، داده های منبع را انتخاب کنید، الگوی Regex خود را وارد کنید و گزینه Extract را انتخاب کنید. برای دریافت نتیجه به عنوان یک تابع سفارشی، نه یک مقدار، چک Insert as a formula را انتخاب کنیدجعبه پس از اتمام، روی دکمه Extract کلیک کنید.
نتایج در یک ستون جدید در سمت راست داده های اصلی شما ظاهر می شوند:
AblebitsRegexExtract syntax
عملکرد سفارشی ما دارای نحو زیر است:
AblebitsRegexExtract(مرجع، بیان_قاعده)Where:
- مرجع (الزامی) - ارجاع به سلول حاوی رشته منبع.
- Regular_expression (الزامی) - الگوی regex مطابقت دارد.
نکته مهم! این عملکرد فقط روی ماشینهایی کار میکند که Ultimate Suite برای Excel نصب شده است.
یادداشتهای استفاده
برای اینکه منحنی یادگیری خود را روانتر و تجربهتان لذتبخشتر شود، لطفاً به این نکات توجه کنید:
- برای ایجاد یک فرمول، میتوانید از ابزارهای Regex یا گفتگوی Insert function اکسل استفاده کنید، یا نام کامل تابع را در یک سلول تایپ کنید. هنگامی که فرمول درج شد، میتوانید آن را مانند هر فرمول اصلی مدیریت کنید (ویرایش، کپی یا جابهجا کنید).
- الگویی که در صفحه ابزارهای Regex وارد میکنید به آرگومان دوم میرود. همچنین می توان یک عبارت منظم را در یک سلول جداگانه نگه داشت. در این مورد، فقط از یک مرجع سلول برای آرگومان دوم استفاده کنید.
- این تابع اولین تطابق پیدا شده را استخراج می کند.
- به طور پیش فرض، تابع مورد است -sensitive . برای تطبیق غیر حساس به حروف بزرگ، از الگوی (?i) استفاده کنید.
- اگر مطابقت پیدا نشد، خطای #N/A است.بازگشت.
Regex برای استخراج رشته بین دو کاراکتر
برای دریافت متن بین دو کاراکتر، میتوانید از یک گروه عکسبرداری یا نگاه به اطراف استفاده کنید.
بیایید می گویید به دنبال استخراج متن بین پرانتز هستید. گرفتن گروه ساده ترین راه است.
الگوی 1 : \[(.*?)\]
با نگاه مثبت به پشت سر و آینده، نتیجه دقیقاً خواهد بود. به همین صورت.
الگوی 2 : (?<=\[)(.*?)(?=\])
لطفاً توجه کنید که گروه عکسبرداری ما (.*؟) یک جستجوی تنبل برای متن بین دو براکت - از [ تا اول ] را انجام می دهد. یک گروه عکسبرداری بدون علامت سوال (.*) یک جستجوی حریصانه انجام می دهد و همه چیز را از اولین [ تا آخرین] ثبت می کند.
با الگوی A2، فرمول به این صورت است. به شرح زیر است:
=AblebitsRegexExtract(A5, $A$2)
نحوه دریافت همه موارد مطابقت
همانطور که قبلا ذکر شد، تابع AblebitsRegexExtract تنها می تواند یک مطابقت را استخراج کند. برای دریافت همه موارد منطبق، می توانید از تابع VBA که قبلاً در مورد آن صحبت کردیم استفاده کنید. با این حال، یک هشدار وجود دارد - VBA RegExp از گرفتن گروهها پشتیبانی نمیکند، بنابراین الگوی بالا کاراکترهای "مرز" را نیز باز میگرداند، براکتها در مورد ما.
=TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))
برای رهایی از میان براکت ها، آنها را با رشته های خالی ("") با استفاده از این فرمول جایگزین کنید:
=SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")
برای خوانایی بهتر، از کاما برای جداکننده استفاده می کنیم.
Regex برای استخراج متن بین دو رشته
رویکردی که ما کار کردهایمآن را به معنای واقعی کلمه تفسیر کنید.
بسته به اینکه کدام عبارت منظم در A2 وارد شده باشد، فرمول زیر نتایج متفاوتی را ایجاد می کند:
=AblebitsRegexExtract(A5, $A$2)
Regex برای استخراج نام دامنه کامل با همه زیر دامنه ها:
Regex برای استخراج یک سطح دوم دامنه بدون زیر دامنه:
به این صورت است که با استفاده از عبارات منظم، بخش هایی از متن را در اکسل استخراج کنید. از شما سپاسگزارم که خواندید و مشتاقانه منتظر دیدار شما در وبلاگ ما در هفته آینده هستم!
دانلودهای موجود
نمونههای Excel Regex Extract (فایل xlsm.)
نسخه آزمایشی Ultimate Suite (فایل exe)
>>\b(0?[0-9]matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) Next matches_index RegExpExtract = text_matches Else RegExpExtract = matches.Item(instance_num - 1) End If End If Exit Function ErrHandl: RegueElnpاگر تجربه کمی با VBA دارید، یک راهنمای کاربر گام به گام ممکن است مفید باشد: نحوه درج کد VBA در Excel.
توجه داشته باشید. برای اینکه این تابع کار کند، مطمئن شوید که فایل خود را به عنوان یک کتاب کار با ماکرو فعال (xlsm.) ذخیره کنید.
نحو RegExpExtract
تابع RegExpExtract یک رشته ورودی را برای مقادیری که با یک عبارت منظم مطابقت دارند جستجو می کند و یک یا همه موارد مطابق را استخراج می کند.
این تابع دارای نحو زیر است. :
RegExpExtract(متن، الگو، [instance_num]، [match_case])Where:
- Text (ضروری) - رشته متنی برای جستجو.
- الگو (الزامی) - عبارت منظم برای مطابقت. هنگامی که به طور مستقیم در یک فرمول ارائه می شود، الگو باید در دو علامت نقل قول قرار داده شود.
- Instance_num (اختیاری) - یک شماره سریال که نشان می دهد کدام نمونه باید استخراج شود. اگر حذف شود، همه موارد منطبق را برمیگرداند (پیشفرض).
- Match_case (اختیاری) - تعیین میکند که حروف متن مطابقت داشته باشد یا نادیده گرفته شود. اگر TRUE یا حذف شده باشد (پیشفرض)، تطبیق حساس به حروف بزرگ انجام میشود. اگر FALSE - به حروف بزرگ و کوچک حساس نیست.
این تابع در همه نسخههای Excel 365، Excel 2021، Excel کار میکند2019، اکسل 2016، اکسل 2013 و اکسل 2010.
4 نکته ای که باید در مورد RegExpExtract بدانید
برای استفاده موثر از این تابع در اکسل خود، چند نکته مهم وجود دارد که باید به آنها توجه کنید:
- بهطور پیشفرض، تابع همه موارد منطبق را به سلولهای همسایه مانند نشان داده شده در این مثال برمیگرداند. برای به دست آوردن یک رخداد خاص، یک عدد مربوط به آرگومان instance_num ارائه دهید.
- به طور پیش فرض، تابع حساس به حروف کوچک و بزرگ است. برای تطبیق بدون حساسیت، آرگومان match_case را روی FALSE تنظیم کنید. به دلیل محدودیت های VBA، ساختار حساس به حروف بزرگ و کوچک (?i) کار نمی کند.
- اگر الگوی معتبر پیدا نشد ، تابع چیزی (رشته خالی) را برمی گرداند.
- اگر الگو نامعتبر باشد ، یک #VALUE! خطایی رخ میدهد.
قبل از اینکه از این تابع سفارشی در کاربرگهای خود استفاده کنید، باید بدانید که این تابع چه چیزی را دارد، درست است؟ مثالهای زیر چند مورد استفاده رایج را پوشش میدهند و توضیح میدهند که چرا رفتار ممکن است در اکسل آرایه دینامیکی (Microsoft 365 و اکسل 2021) و اکسل سنتی (2019 و نسخههای قدیمیتر) متفاوت باشد.
توجه داشته باشید. نمونه های خارج از regex برای مجموعه داده های بسیار ساده نوشته شده اند. ما نمی توانیم تضمین کنیم که آنها بدون نقص در کاربرگ های واقعی شما کار می کنند. کسانی که با regex تجربه دارند موافقند که نوشتن عبارات منظم راهی بی پایان به سوی کمال است - تقریباً همیشه راهی برای ساختن آن وجود دارد.زیباتر است یا قادر به مدیریت طیف وسیع تری از داده های ورودی است.
Regex برای استخراج عدد از رشته
با پیروی از اصل اساسی آموزش "از ساده به پیچیده"، ما با یک حالت بسیار ساده شروع می کنیم: استخراج عدد از رشته.
اولین چیزی که باید تصمیم بگیرید این است که کدام عدد را بازیابی کنید: اول، آخرین، رخداد خاص یا همه اعداد.
نخستین عدد را استخراج کنید
این به همان سادگی است که regex می تواند بدست آورد. با توجه به اینکه \d به معنای هر رقمی از 0 تا 9 است و + به معنای یک یا چند بار است، عبارت منظم ما به این شکل است:
Pattern : \d+
Set instance_num به 1 می رسد و نتیجه دلخواه را می گیرید:
=RegExpExtract(A5, "\d+", 1)
جایی که A5 رشته اصلی است.
برای راحتی، می توانید وارد کنید الگو را در یک سلول از پیش تعریف شده ($A$2 ) و آدرس آن را با علامت $ قفل کنید:
=RegExpExtract(A5, $A$2, 1)
دریافت آخرین عدد
برای استخراج آخرین عدد در یک رشته ، الگوی مورد استفاده در اینجا آمده است:
الگو : (\d+)(?!.*\d)
ترجمه شده به زبان انسانی ، می گوید: عددی را پیدا کنید که (هیچ جا، نه بلافاصله) با هیچ عدد دیگری دنبال نمی شود. برای بیان این موضوع، از یک نگاه منفی (?!.*\d) استفاده می کنیم، به این معنی که در سمت راست الگو بدون توجه به اینکه چند کاراکتر دیگر قبل از آن وجود دارد، نباید رقم دیگری (\d) وجود داشته باشد.
=RegExpExtract(A5, "(\d+)(?!.*\d)")
نکات:
- برای دریافت رویداد خاص ، از \d+ برای pattern و یک سریال مناسب استفاده کنیدشماره برای instance_num .
- فرمول استخراج همه اعداد در مثال بعدی مورد بحث قرار گرفته است.
Regex برای استخراج همه موارد مطابقت
با فشار دادن مثال ما کمی جلوتر، فرض کنید می خواهید همه اعداد را از یک رشته دریافت کنید، نه فقط یک.
همانطور که ممکن است به خاطر داشته باشید، تعداد منطبقات استخراج شده توسط گزینه اختیاری <1 کنترل می شود. آرگومان>instance_num . پیشفرض همه موارد منطبق است، بنابراین شما به سادگی این پارامتر را حذف میکنید:
=RegExpExtract(A2, "\d+")
فرمول برای یک سلول به زیبایی کار میکند، اما رفتار در اکسل آرایه دینامیک و نسخههای غیر پویا متفاوت است.
Excel 365 و Excel 2021
به دلیل پشتیبانی از آرایه های پویا، یک فرمول معمولی به طور خودکار به تعداد سلول های مورد نیاز برای نمایش همه نتایج محاسبه شده ریخته می شود. از نظر اکسل، به این یک محدوده ریخته شده می گویند:
Excel 2019 و پایین تر
در اکسل پیش پویا، فرمول بالا فقط یک مطابقت را برمی گرداند. برای به دست آوردن چندین تطابق، باید آن را به فرمول آرایه تبدیل کنید. برای این کار، محدودهای از سلولها را انتخاب کنید، فرمول را تایپ کنید و Ctrl + Shift + Enter را فشار دهید تا آن را کامل کنید.
یکی از نقاط ضعف این رویکرد، دستهای از خطاهای #N/A است که در "سلولهای اضافی" ظاهر میشوند. . متأسفانه، هیچ کاری نمی توان در مورد آن انجام داد (نه IFERROR و نه IFNA نمی توانند آن را برطرف کنند، افسوس).
همه موارد منطبق را در یک سلول استخراج کنید
هنگام پردازش ستونی از داده ها، روش فوق بدیهی است که کار نخواهد کرد. در این مورد، یک راه حل ایده آلهمه مسابقات را در یک سلول برمی گرداند. برای انجام این کار، نتایج RegExpExtract را در تابع TEXTJOIN قرار دهید و آنها را با هر جداکننده ای که دوست دارید، از هم جدا کنید، مثلاً یک کاما و یک فاصله:
=TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))
توجه داشته باشید. از آنجایی که تابع TEXTJOIN فقط در اکسل برای مایکروسافت 365، اکسل 2021 و اکسل 2019 موجود است، این فرمول در نسخه های قدیمی تر کار نمی کند.
Regex برای استخراج متن از رشته
استخراج متن از یک رشته الفبایی در اکسل یک کار چالش برانگیز است. با regex، به آسانی پای می شود. فقط از یک کلاس نفی برای مطابقت با هر چیزی که رقمی نیست استفاده کنید.
Pattern : [^\d]+
برای دریافت زیر رشتهها در سلولهای جداگانه (محدوده ریختن) ، فرمول این است:
=RegExpExtract(A5, "[^\d]+")
برای خروجی همه موارد منطبق در یک سلول، تابع RegExpExtract را در TEXTJOIN به صورت زیر قرار دهید:
=TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))
Regex در استخراج آدرس ایمیل از رشته
برای بیرون آوردن یک آدرس ایمیل از یک رشته حاوی اطلاعات مختلف، یک عبارت منظم بنویسید که ساختار آدرس ایمیل را تکرار می کند.
Pattern : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}
شکستن این regex ، این چیزی است که دریافت می کنیم:
- [\w\.\-]+ یک نام کاربری است که ممکن است شامل 1 یا چند نویسه الفبایی عددی، زیرخط، نقطه و خط فاصله باشد.
- @ نماد
- [A-Za-z0-9\.\-]+ نام دامنه ای است متشکل از: حروف بزرگ و کوچک، اعداد، خط فاصله و نقطه (در صورتاز زیر دامنه ها). زیرخط در اینجا مجاز نیست، بنابراین از 3 مجموعه کاراکتر مختلف (مانند A-Z a-z و 0-9) به جای \w استفاده می شود که با هر حرف، رقم یا زیرخط مطابقت دارد.
- \.[A-Za-z. ]{2,24} یک دامنه سطح بالا است. از یک نقطه به دنبال حروف بزرگ و کوچک تشکیل شده است. بیشتر دامنههای سطح بالا 3 حرف دارند (مانند .com .org، .edu و غیره)، اما از نظر تئوری میتوانند از 2 تا 24 حرف (طولانیترین TLD ثبتشده) داشته باشند.
=RegExpExtract(A5, $A$2)
Regex برای استخراج دامنه از ایمیل
وقتی که به استخراج دامنه ایمیل میرسد، اولین فکری که به ذهن میرسد استفاده از یک گروه ضبط برای یافتن متنی است که بلافاصله بعد از کاراکتر @ میآید.
Pattern : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})
آن را به تابع RegExp ما ارائه دهید:
=RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")
و این نتیجه را دریافت خواهید کرد:
با عبارات منظم کلاسیک، هر چیزی خارج از یک گروه تصویربرداری در استخراج گنجانده نمی شود. هیچ کس نمی داند چرا VBA RegEx متفاوت عمل می کند و "@" را نیز ضبط می کند. برای خلاص شدن از شر آن، می توانید با جایگزین کردن آن با یک رشته خالی، اولین کاراکتر را از نتیجه حذف کنید.
=REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")
عبارت معمولی برای استخراج شماره تلفن
شماره تلفن را می توان به روش های مختلف نوشت، به همین دلیل است که تقریباً غیرممکن است که راه حلی برای همه چیز ارائه شود(\d{4}from string
یک عبارت منظم برای استخراج تاریخ به قالبی که تاریخ در یک رشته ظاهر می شود بستگی دارد. برای مثال:
برای استخراج تاریخهایی مانند 1/1/21 یا 01/01/2021، regex عبارت است از: \d{1,2}\/\d{1,2}\/(\d {4}موقعیت. با این وجود، میتوانید تمام قالبهای مورد استفاده در مجموعه داده خود را یادداشت کنید و سعی کنید آنها را مطابقت دهید.
برای این مثال، ما یک regex ایجاد میکنیم که شماره تلفنها را در هر یک از این قالبها استخراج میکند:
(123) 345-6789 (123) 345 6789 (123)3456789 123- 345-6789 | 123.345.6789 123 345 6789 1233456789 |
الگوی : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b
- قسمت اول \(?\d{3} با صفر یا یک پرانتز ابتدایی و به دنبال آن سه رقم d{3} مطابقت دارد.
- قسمت [-\. \)]* به معنای هر کاراکتری در کروشه است که 0 یا بیشتر بار ظاهر می شود: خط فاصله، نقطه، فاصله یا پرانتز بسته.
- بعد، دوباره سه رقم داریم d{3} و به دنبال آن هر خط فاصله، نقطه یا فاصله [-\. ]؟ 0 یا 1 بار ظاهر می شود.
- پس از آن، یک گروه چهار رقمی وجود دارد \d{4}.
- در نهایت، یک مرز کلمه وجود دارد \b که مشخص می کند یک شماره تلفن ما هستیم. جستجو برای نمی تواند بخشی از یک عدد بزرگتر باشد.
فرمول کامل این شکل را به خود می گیرد:
=RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")
لطفاً توجه داشته باشید که regex فوق ممکن است چند عدد را برگرداند. نتایج مثبت کاذب مانند 123) 456 7899 یا (123 456 7899. نسخه زیر این مشکلات را برطرف می کند. با این حال، این نحو فقط در توابع VBA RegExp کار می کند، نه در عبارات منظم کلاسیک.
Pattern. : (\(\d{3}\)out برای بیرون کشیدن متن بین دو کاراکتر برای استخراج متن بین دو رشته نیز کار خواهد کرد.
به عنوان مثال، برای به دست آوردن همه چیز بین "تست 1" و "تست 2"، از عبارت منظم زیر استفاده کنید.
Pattern : test 1(.*?)test 2
فرمول کامل این است:
=AblebitsRegexExtract(A5, "test 1(.*?)test 2")
Regex برای استخراج دامنه از URL
حتی با عبارات منظم، استخراج نام دامنه از URL ها کار بی اهمیتی نیست. عنصر کلیدی که این ترفند را انجام می دهد، گروه هایی است که دستگیر نمی شوند. بسته به هدف نهایی خود، یکی از رجکس های زیر را انتخاب کنید.
برای دریافت نام دامنه کامل شامل زیر دامنه ها
الگوی : (?: https?\: