فهرست مطالب
در رشته های زیر، فرض کنید می خواهید شماره سفارش اول را حذف کنید. همه این اعداد با علامت هش (#) شروع می شوند و دقیقاً شامل 5 رقم هستند. بنابراین، میتوانیم آنها را با استفاده از این regex شناسایی کنیم:
Pattern : #\d{5}\b
کلمه boundary \b مشخص میکند که یک زیررشته منطبق نمیتواند باشد. بخشی از یک رشته بزرگتر مانند #10000001.
برای حذف همه موارد منطبق، آرگومان instance_num تعریف نشده است:
=RegExpReplace(A5, "#\d{5}\b", "")
برای از بین بردن فقط اولین رخداد، آرگومان instance_num را روی 1 قرار دادیم:
=RegExpReplace(A5, "#\d{5}\b", "", 1)
Regex برای حذف کاراکترهای خاص
برای حذف کاراکترهای خاص از یک رشته، فقط تمام کاراکترهای ناخواسته را یادداشت کرده و آنها را با یک نوار عمودی جدا کنید.سینتکس عاری از محدودیت های VBA RegExp، و ثانیاً، نیازی به درج هیچ کد VBA در کتاب های کاری خود ندارید، زیرا همه یکپارچه سازی کد توسط ما در باطن انجام می شود.
بخش کار شما این است که یک عبارت منظم بسازید و در یک مثال عملی به شما نشان دهم که چگونه این کار را انجام دهید.
نحوه حذف متن داخل پرانتز و پرانتز با استفاده از regex
در رشته های متنی طولانی، اطلاعات کمتر مهمی وجود دارد. اغلب در [پرانتز] و (پرانتز) قرار می گیرد. چگونه میتوانید آن جزئیات نامربوط را حذف کنید و تمام دادههای دیگر را حفظ کنید؟
در واقع، ما قبلاً یک regex مشابه برای حذف برچسبهای html ساختهایم، به عنوان مثال، متن در براکتهای زاویه. بدیهی است که روشهای مشابه برای براکتهای مربع و گرد نیز جواب میدهند.
Pattern : (\(.*?\))
آیا تا به حال فکر کرده اید که اکسل چقدر قدرتمند می شود اگر کسی بتواند جعبه ابزار خود را با عبارات منظم غنی کند؟ ما نه تنها فکر کردهایم، بلکه روی آن کار کردهایم :) و اکنون، میتوانید این تابع فوقالعاده RegEx را به کتابهای کاری خود اضافه کنید و رشتههای فرعی مطابق با یک الگو را در کمترین زمان ممکن پاک کنید!
هفته گذشته، ما نگاهی به آن انداختیم. نحوه استفاده از عبارات منظم برای جایگزینی رشته ها در اکسل. برای این کار، یک تابع Regex Replace سفارشی ایجاد کردیم. همانطور که مشخص شد، این تابع فراتر از کاربرد اصلی خود است و نه تنها می تواند رشته ها را جایگزین کند، بلکه آنها را نیز حذف کند. چگونه می تواند باشد؟ از نظر اکسل، حذف یک مقدار چیزی نیست جز جایگزین کردن آن با یک رشته خالی، چیزی که تابع Regex ما در آن بسیار خوب است!
عملکرد VBA RegExp برای حذف زیر رشته ها در اکسل
همانطور که همه می دانیم، عبارات منظم به طور پیش فرض در اکسل پشتیبانی نمی شوند. برای فعال کردن آنها، باید تابع تعریف شده توسط کاربر خود را ایجاد کنید. خبر خوب این است که چنین عملکردی قبلاً نوشته شده، آزمایش شده و آماده استفاده است. تنها کاری که باید انجام دهید این است که این کد را کپی کنید، آن را در ویرایشگر VBA خود جایگذاری کنید، و سپس فایل خود را به عنوان کتاب کار فعال شده ماکرو (xlsm.) ذخیره کنید.
این تابع دارای نحو زیر:
RegExpReplace(متن، الگو، جایگزین، [instance_num]، [match_case])سه آرگومان اول مورد نیاز است، دو آرگومان آخر اختیاری هستند.
Where:
- Text - رشته متنی برای جستجواین امکان وجود دارد تا زمانی که یک براکت بسته را پیدا کند.
هر الگوی را که انتخاب کنید، نتیجه کاملاً یکسان خواهد بود. فرمول این است:
=RegExpReplace(A5, "]*>", "")
یا می توانید از کمیت کننده تنبل همانطور که در تصویر نشان داده شده است استفاده کنید:
این راه حل کاملاً برای تک متن (ردیف های 5 - 9). برای چندین متن (ردیف های 10 - 12)، نتایج مشکوک است - متون از برچسب های مختلف در یک ادغام می شوند. آیا این درست است یا خیر؟ من می ترسم، این چیزی نیست که بتوان به راحتی تصمیم گرفت - همه چیز به درک شما از نتیجه مطلوب بستگی دارد. به عنوان مثال، در B11، نتیجه "A1" انتظار می رود. در حالی که در B10، ممکن است بخواهید "data1" و "data2" با فاصله از هم جدا شوند.
برای حذف تگ های html و جداسازی متن های باقی مانده با فاصله، می توانید به این ترتیب عمل کنید:
30>
=RegExpReplace(A5, "]*>", " ")
=RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")
=TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "))
نتیجه چیزی شبیه به این خواهد بود:
ابزار حذف Abblebits Regex
اگر فرصتی برای استفاده از Ultimate Suite ما برای اکسل داشته اید، احتمالاً قبلاً ابزار Regex جدیدی را که با نسخه اخیر معرفی شده اند، کشف کرده اید. زیبایی این توابع Regex مبتنی بر دات نت این است که اولاً از عبارت منظم با ویژگی های کامل پشتیبانی می کنند.گزینه Remove را بزنید و Remove را بزنید.
برای دریافت نتایج بهعنوان فرمول، نه مقادیر، کادر انتخاب Insert as a formula را انتخاب کنید.
برای حذف متن درون پرانتز از رشتهها در A2:A5، تنظیمات را پیکربندی میکنیم. به صورت زیر:
در نتیجه، تابع AblebitsRegexRemove در ستون جدیدی در کنار داده های اصلی شما درج می شود.
این تابع همچنین می تواند مستقیماً در یک سلول از طریق کادر محاوره ای استاندارد Insert Function وارد شود، جایی که در زیر AblebitsUDFs طبقه بندی می شود.
از آنجایی که AblebitsRegexRemove برای حذف متن طراحی شده است، تنها به دو آرگومان نیاز دارد - رشته منبع و regex. هر دو پارامتر را می توان مستقیماً در یک فرمول تعریف کرد یا در قالب مراجع سلولی ارائه کرد. در صورت نیاز، این تابع سفارشی را می توان همراه با هر تابع بومی استفاده کرد.
به عنوان مثال، برای برش فاصله های اضافی در رشته های حاصل، می توانید از تابع TRIM به عنوان یک بسته بندی استفاده کنید:
=TRIM(AblebitsRegexRemove(A5, $A$2))
این نحوه حذف رشته ها در اکسل با استفاده از عبارات منظم است. از شما سپاسگزارم که خواندید و مشتاقانه منتظر دیدار شما در وبلاگ ما در هفته آینده هستم!
دانلودهای موجود
حذف رشته ها با استفاده از regex - نمونه ها (فایل xlsm.)
Ultimate Suite - نسخه آزمایشی (فایل exe)
in.برای اطلاعات بیشتر، لطفاً به تابع RegExpReplace مراجعه کنید.
نکته. در موارد ساده، می توانید کاراکترها یا کلمات خاصی را از سلول ها با فرمول های اکسل حذف کنید. اما عبارات منظم گزینه های بسیار بیشتری برای این کار ارائه می دهند.
نحوه حذف رشته ها با استفاده از عبارات منظم - مثال ها
همانطور که در بالا ذکر شد، برای حذف قسمت هایی از متن مطابق با یک الگو، باید آنها را جایگزین کنید. با یک رشته خالی بنابراین، یک فرمول عمومی این شکل را به خود میگیرد:
RegExpReplace(متن، الگو، ""، [instance_num]، [match_case])مثالهای زیر پیادهسازیهای مختلف این مفهوم اساسی را نشان میدهند.
حذف همه منطبقها یا تطابق خاص
عملکرد RegExpReplace برای یافتن همه زیررشتههای منطبق با یک regex معین طراحی شده است. کدام رخدادهایی که باید حذف شوند توسط آرگومان اختیاری چهارم، به نام instance_num کنترل میشود.
پیشفرض "همه منطبقها" است - زمانی که instance_num عملگر الحاق (&) و توابع متنی مانند RIGHT، MID و LEFT.
به عنوان مثال، برای نوشتن همه شمارههای تلفن در قالب (123) 456-7890، فرمول این است:
="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)
جایی که B5 خروجی تابع RegExpReplace است.
حذف کاراکترهای خاص با استفاده از regex
در یکی از آموزش های ما، ما به نحوه حذف کاراکترهای ناخواسته در اکسل با استفاده از توابع داخلی و سفارشی نگاه کردیم. عبارات منظم کار را بسیار آسان تر می کند! به جای فهرست کردن همه کاراکترها برای حذف، فقط آنهایی را که میخواهید حفظ کنید مشخص کنید :)
الگو بر اساس کلاسهای کاراکترهای رد شده است - یک کاراکتر در یک کلاس کاراکتر قرار داده میشود [^ ] برای مطابقت با هر کاراکتری که در پرانتز نیست. کمیت + آن را مجبور می کند تا کاراکترهای متوالی را به عنوان یک تطابق واحد در نظر بگیرد، به طوری که جایگزینی برای یک زیررشته منطبق به جای هر کاراکتر جداگانه انجام می شود.
بسته به نیاز شما، یکی از رجکس های زیر را انتخاب کنید.
برای حذف نویسههای غیر الفبایی ، یعنی همه نویسهها به جز حروف و اعداد:
Pattern : [^0-9a-zA-Z] +
برای پاک کردن همه کاراکترها به جز حروف ، رقم و فاصله :
الگو : [^0-9a-zA-Z ]+
برای حذف همه کاراکترها به جز حروف ، رقم و زیرخط ، میتوانید از \ W که مخفف هر کاراکتری است که نویسه الفبایی یا عددی نیستunderscore:
Pattern : \W+
اگر می خواهید چند کاراکتر دیگر را نگه دارید ، به عنوان مثال. علائم نگارشی، آنها را در داخل پرانتز قرار دهید.
به عنوان مثال، برای حذف هر کاراکتری غیر از حرف، رقم، نقطه، کاما یا فاصله، از regex زیر استفاده کنید:
Pattern : [^0-9a-zA-Z\., ]+
این کار با موفقیت همه کاراکترهای خاص را حذف می کند، اما فضای خالی اضافی باقی می ماند.
برای رفع این مشکل، میتوانید تابع فوق را در تابع دیگری قرار دهید که چندین فاصله را با یک کاراکتر فاصله جایگزین میکند.
=RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")
یا فقط از تابع اصلی TRIM با همان جلوه استفاده کنید. :
=TRIM(RegExpReplace(A5, $A$2, ""))
Regex برای حذف کاراکترهای غیر عددی
برای حذف همه کاراکترهای غیر عددی از یک رشته، می توانید از این فرمول طولانی یا یکی از رجکس های بسیار ساده فهرست شده در زیر.
هر کاراکتری را که رقمی نیست مطابقت دهید:
Pattern : \D+
نویسههای غیر عددی را با استفاده از کلاسهای نفی حذف کنید:
Pattern : [^0-9]+
Pattern : [^\d] +
نکته. اگر هدف شما حذف متن و ریختن اعداد باقیمانده در سلولهای جداگانه یا قرار دادن همه آنها در یک سلول است که با یک جداکننده مشخص از هم جدا شدهاند، از تابع RegExpExtract همانطور که در نحوه استخراج اعداد از رشته با استفاده از عبارات منظم توضیح داده شده است استفاده کنید.
Regex برای حذف همه چیز بعد از فاصله
برای پاک کردن همه چیز پس از فاصله، از فاصله ( ) یا استفاده کنیدکاراکتر فضای خالی (\s) برای پیدا کردن اولین فاصله و .* برای مطابقت با هر کاراکتر بعد از آن.
اگر رشته های تک خطی دارید که فقط حاوی فاصله های معمولی هستند (مقدار 32 در سیستم ASCII 7 بیتی) ، واقعاً مهم نیست که از کدام یک از رجکس های زیر استفاده می کنید. در مورد رشته های چند خطی، تفاوت ایجاد می کند.
برای حذف همه چیز بعد از یک کاراکتر فاصله ، از این regex استفاده کنید:
Pattern : " .*"
=RegExpReplace(A5, " .*", "")
این فرمول هر چیزی را بعد از اولین فاصله در هر خط حذف می کند. برای اینکه نتایج به درستی نمایش داده شوند، حتما Wrap Text را روشن کنید.
برای حذف همه چیز بعد از یک فضای خالی (از جمله فاصله، برگه، بازگشت کالسکه و خط جدید)، regex is:
Pattern : \s.*
=RegExpReplace(A5, "\s.*", "")
زیرا \s با چند نوع فضای خالی مختلف از جمله یک خط جدید<مطابقت دارد 9> (\n)، این فرمول همه چیز را پس از اولین فاصله در یک سلول حذف می کند، مهم نیست چند خط در آن وجود دارد.
Regex برای حذف متن پس از مشخص شدن کاراکتر
با استفاده از روشهای مثال قبلی، میتوانید متن را بعد از هر نویسهای که مشخص میکنید حذف کنید.
برای مدیریت هر خط جداگانه:
الگوی عمومی : char.*
در رشته های تک خطی، این کار همه چیز را بعد از char حذف می کند. در رشته های چند خطی، هر خط به صورت جداگانه پردازش می شود زیرا در طعم VBA Regex، نقطه (.) با هر کاراکتری به جز یک کاراکتر جدید مطابقت دارد.شروع یک رشته ^، صفر یا چند کاراکتر غیر فاصله [^ ]* را مطابقت می دهیم که بلافاصله با یک یا چند فاصله " +" دنبال می شوند. آخرین قسمت برای جلوگیری از ایجاد فاصله های بالقوه در نتایج اضافه می شود.
برای حذف متن قبل از فاصله اول در هر خط، فرمول در حالت پیش فرض "همه منطبق ها" نوشته می شود ( instance_num omitted):
=RegExpReplace(A5, "^[^ ]* +", "")
برای حذف متن قبل از اولین فاصله در خط اول، و دست نخورده ماندن سایر خطوط، آرگومان instance_num روی 1 تنظیم می شود:
=RegExpReplace(A5, "^[^ ]* +", "", 1)
Regex برای حذف همه چیز قبل از کاراکتر
ساده ترین راه برای حذف تمام متن قبل از یک کاراکتر خاص، استفاده از regex است. مانند این:
الگوی عمومی : ^[^char]*char
به زبان انسانی ترجمه شده، میگوید: "از آغاز رشتهای که توسط ^ ، 0 یا بیشتر از نویسه ها را به جز char [^char]* تا اولین رخداد char مطابقت دهید.
به عنوان مثال، برای حذف تمام متن قبل از اولین دو نقطه ، از این عبارت منظم استفاده کنید:
Pattern : ^[^:]*:
برای جلوگیری از ایجاد فاصله در نتایج، یک کاراکتر فاصله سفید \s* به آن اضافه کنید. با این کار همه چیز حذف خواهد شد g قبل از اولین دو نقطه و هر فاصله را درست بعد از آن کوتاه کنید:
Pattern : ^[^:]*:\s*
=RegExpReplace(A5, "^[^:]*:\s*", "")
نکته. علاوه بر عبارات معمولی، اکسل ابزار خاص خود را برای حذف متن بر اساس موقعیت یا مطابقت دارد. برای یادگیری نحوه انجام کار با فرمول های بومی،لطفاً نحوه حذف متن قبل یا بعد از یک کاراکتر در اکسل را ببینید.
Regex برای حذف همه چیز به جز
برای حذف همه کاراکترها از یک رشته به جز آنهایی که می خواهید نگه دارید، از کلاس های کاراکترهای نفی شده استفاده کنید.
به عنوان مثال، برای حذف همه کاراکترها به جز حروف کوچک و نقطه، regex این است:
Pattern : [^a-z\.]+
در واقع، میتوانیم بدون کمیت + در اینجا انجام دهیم زیرا تابع ما جایگزین همه میشود. کبریت پیدا کرد کمیت فقط آن را کمی سریعتر میکند - به جای مدیریت هر کاراکتر جداگانه، یک زیر رشته را جایگزین میکنید.
=RegExpReplace(A5, "[^a-z\.]+", "")
Regex برای حذف برچسبهای html در اکسل
در ابتدا، باید توجه داشت که HTML یک زبان معمولی نیست، بنابراین تجزیه آن با استفاده از عبارات منظم بهترین راه نیست. همانطور که گفته شد، رجکسها قطعاً میتوانند به حذف برچسبها از سلولهای شما کمک کنند تا مجموعه داده شما تمیزتر شود.
با توجه به اینکه برچسبهای html همیشه در براکتهای زاویه قرار میگیرند، میتوانید آنها را با استفاده از یکی از رجکسهای زیر پیدا کنید.
کلاس نفی شده:
Pattern : ]*>
در اینجا، یک براکت زاویه باز را مطابقت می دهیم و به دنبال آن صفر یا بیشتر از هر کاراکتری به جز براکت زاویه بسته [^>]* تا نزدیکترین زاویه بسته هر چیزی از اولین براکت باز تا اولین براکت بسته. علامت سوال .* را مجبور می کند تا با تعداد کمتری از کاراکترها مطابقت داشته باشدخط.
برای پردازش تمام خطوط به عنوان یک رشته:
الگوی عمومی : char(.