Регекс для видалення певних символів або тексту в Excel

  • Поділитися Цим
Michael Brown

Ви коли-небудь думали, наскільки потужним був би Excel, якби хтось зміг збагатити його інструментарій регулярними виразами? Ми не тільки думали, але й працювали над цим :) І тепер ви можете додати цю чудову функцію RegEx у свої робочі книги і в найкоротші терміни видаляти підрядки, що відповідають певному шаблону!

Минулого тижня ми розглянули, як використовувати регулярні вирази для заміни рядків в Excel. Для цього ми створили користувальницьку функцію Regex Replace. Як виявилося, функція виходить за рамки свого основного застосування і може не тільки замінювати рядки, але і видаляти їх. Як таке може бути? З точки зору Excel, видалення значення - це не що інше, як заміна його на порожній рядок, чим і є наша функція Regexдуже добре!

    Функція VBA RegExp для видалення підрядків в Excel

    Як відомо, за замовчуванням регулярні вирази в Excel не підтримуються. Щоб їх включити, потрібно створити власну функцію користувача. Хороша новина полягає в тому, що така функція вже написана, протестована і готова до використання. Все, що вам потрібно зробити, це скопіювати цей код, вставити його в редакторі VBA, а потім зберегти ваш файл як робоча книга з підтримкою макросів (.xlsm).

    Функція має наступний синтаксис:

    RegExpReplace(text, pattern, replacement, [instance_num], [match_case])

    Перші три аргументи є обов'язковими, останні два - необов'язковими.

    Де:

    • Текст - текстовий рядок для пошуку.
    • Візерунок - регулярний вираз для пошуку.
    • Заміна - текст замінити на наступний видалити підрядки збігається з малюнком, використовуйте порожній рядок ("") на заміну.
    • Номер примірника (необов'язково) - екземпляр для заміни. Якщо не вказано, замінюються всі знайдені збіги (за замовчуванням).
    • Match_case (необов'язково) - булеве значення, що вказує на те, чи потрібно враховувати регістр тексту. Для співставлення з урахуванням регістру використовуйте TRUE (за замовчуванням), для не враховуючи регістр - FALSE.

    Для отримання додаткової інформації, будь ласка, зверніться до функції RegExpReplace.

    Порада. У простих випадках видалити конкретні символи або слова з комірок можна за допомогою формул Excel. Але регулярні вирази надають для цього набагато більше можливостей.

    Як видаляти рядки за допомогою регулярних виразів - приклади

    Як зазначалося вище, для видалення частин тексту, що відповідають шаблону, необхідно замінити їх порожнім рядком. Таким чином, загальна формула набуває такого вигляду:

    RegExpReplace(text, pattern, "", [instance_num], [match_case])

    Наведені нижче приклади демонструють різні варіанти реалізації цієї базової концепції.

    Видалити всі збіги або певний збіг

    Функція RegExpReplace призначена для пошуку всіх підрядків, що відповідають заданому регексу. Які саме входження видаляти, контролюється 4-м необов'язковим аргументом з ім'ям instance_num .

    За замовчуванням встановлено значення "всі збіги" - коли instance_num опускається, видаляються всі знайдені збіги. Щоб видалити конкретний збіг, необхідно вказати номер екземпляра.

    У наведених нижче рядках, припустимо, потрібно видалити номер першого порядку. Всі такі номери починаються зі знаку хешу (#) і містять рівно 5 цифр. Отже, ми можемо ідентифікувати їх за допомогою цього регексу:

    Візерунок : #\d{5}\b

    Слово boundary \b вказує на те, що відповідний підрядок не може бути частиною більшого рядка, наприклад, #10000001.

    Щоб видалити всі збіги, натисніть кнопку instance_num аргумент не визначений:

    =RegExpReplace(A5, "#\d{5}\b", "")

    Для викорінення тільки першого явища ми задаємо instance_num аргумент до 1:

    =RegExpReplace(A5, "#\d{5}\b", "", 1)

    Регекс для видалення певних символів

    Щоб вилучити певні символи з рядка, просто запишіть всі непотрібні символи і відокремте їх вертикальною рискою

    Наприклад, для стандартизації телефонних номерів, записаних у різних форматах, спочатку ми позбавляємося від специфічних символів, таких як дужки, дефіси, крапки та пробіли.

    Візерунок : \(

    =RegExpReplace(A5, "\(

    Результатом цієї операції є 10-значне число на кшталт "1234567890".

    Для зручності можна ввести регекс в окрему комірку, і посилатися на цю комірку за допомогою абсолютного посилання, наприклад, $A$2:

    =RegExpReplace(A5, $A$2, "")

    А потім, ви можете стандартизувати форматування так, як вам потрібно, використовуючи оператор конкатенації (&) і текстові функції, такі як RIGHT, MID і LEFT.

    Наприклад, щоб записати всі номери телефонів у форматі (123) 456-7890, формула має вигляд:

    ="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)

    Де B5 - вихід функції RegExpReplace.

    Видалення спеціальних символів за допомогою regex

    В одному з наших уроків ми розглядали, як видалити непотрібні символи в Excel за допомогою вбудованих і користувацьких функцій. Регулярні вирази значно спрощують завдання! Замість того, щоб перераховувати всі символи, які потрібно видалити, просто вкажіть ті, які ви хочете залишити :)

    В основу моделі покладено заперечні класи символів - всередині класу символів [^ ] ставиться лапка, щоб відповідати будь-якому окремому символу НЕ в дужках. Квантор + змушує розглядати послідовні символи як один збіг, так що заміна виконується для відповідного підрядка, а не для кожного окремого символу.

    Залежно від ваших потреб, виберіть один з наступних регексів.

    Для видалення неалфавітно-цифровий символи, тобто всі символи, крім букв і цифр:

    Візерунок : [^0-9a-zA-Z]+

    Щоб очистити всі символи крім листів , цифри і місця :

    Візерунок : [^0-9a-zA-Z ]+

    Щоб видалити всі символи крім листів , цифри і підкреслити ви можете використовувати \W, що означає будь-який символ, який НЕ є буквено-цифровим символом або символом підкреслення:

    Візерунок : \W+

    Якщо ви хочете зберегти деякі інші символи наприклад, розділові знаки, слід брати в дужки.

    Наприклад, щоб видалити будь-який символ, крім літери, цифри, крапки, коми або пробілу, використовуйте наступний регекс:

    Візерунок : [^0-9a-zA-Z\., ]+

    При цьому успішно усуваються всі спеціальні символи, але залишаються зайві пробіли.

    Щоб виправити це, можна вкласти вищевказану функцію в іншу, яка замінює декілька пробілів на один символ пробілу.

    =RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")

    Або просто використовуйте рідну функцію TRIM з тим же ефектом:

    =TRIM(RegExpReplace(A5, $A$2, ""))

    Реглекс для видалення нецифрових символів

    Щоб видалити всі нецифрові символи з рядка, ви можете використовувати або цю довгу формулу, або один з дуже простих реглексів, перерахованих нижче.

    Установіть відповідність між будь-яким символом, який НЕ є цифрою:

    Візерунок : \D+

    Розділення нецифрових символів з використанням заперечних класів:

    Візерунок : [^0-9]+

    Візерунок : [^\d]+

    Порада. Якщо ваша мета - видалити текст, а числа, що залишилися, розкидати по окремих комірках або помістити їх всі в одну комірку, відокремивши заданим роздільником, то скористайтеся функцією RegExpExtract, як це описано в статті Як витягти числа з рядка за допомогою регулярних виразів.

    Regex для видалення всього після пробілу

    Щоб стерти все, що стоїть після пробілу, використовуйте або пробіл ( ), або пробіл (\s), щоб знайти перший пробіл, і .*, щоб знайти будь-які символи після нього.

    Якщо у вас є однорядкові рядки, які містять тільки звичайні пробіли (значення 32 в 7-бітній системі ASCII), то немає особливого значення, який з наведених нижче регексів ви використовуєте. У випадку багаторядкових рядків, це має значення.

    Видалити все після символу пробілу використовуйте цей реґекс:

    Візерунок : " .*"

    =RegExpReplace(A5, " .*", "")

    Ця формула вилучить все, що знаходиться після першого пробілу в кожен рядок Для коректного відображення результатів не забудьте увімкнути опцію "Обернути текст".

    Зняти з себе все після пробілу (включаючи пробіл, табуляцію, повернення каретки та новий рядок), то регексом буде

    Візерунок : \s.*

    =RegExpReplace(A5, "\s.*", "")

    Тому що \s відповідає декільком різним типам пробілів, включаючи нова лінія (\n), ця формула видаляє все, що знаходиться після першого пробілу в комірці, незалежно від того, скільки в ній рядків.

    Реглекс для видалення тексту після певного символу

    Використовуючи методи з попереднього прикладу, можна видалити текст після будь-якого символу, який ви вкажете.

    Опрацьовувати кожен рядок окремо:

    Загальна схема : char.*.

    В однорядкових рядках це видалить все після char - символ У багаторядкових рядках кожен рядок буде оброблятися окремо, оскільки у VBA Regex смаку крапка (.) відповідає будь-якому символу, крім нового рядка.

    Обробити всі рядки як один рядок:

    Загальна схема : char(.

    Щоб видалити все, що знаходиться після даного символу, включаючи нові рядки, до шаблону додається \n.

    Наприклад, щоб видалити текст після першої коми в рядку, спробуйте такі регулярні вирази:

    Візерунок : ,.*

    Візерунок : ,(.

    На скріншоті нижче ви можете побачити, як відрізняються результати.

    Regex для видалення всього до пробілу

    При роботі з довгими рядками тексту іноді виникає потреба скоротити їх, видаливши однакову частину інформації у всіх комірках. Нижче ми розглянемо два таких випадки.

    Видаліть все до останнього пробілу

    Як і в попередньому прикладі, регулярний вираз залежить від вашого розуміння "пробілу".

    Щоб відповідати будь-чому до останній пробіл цей реґекс підійде (лапки додані, щоб було помітно пробіл після зірочки).

    Візерунок : ".* "

    Щоб відповідати будь-чому, що було до останній пробіл (включаючи пробіл, табуляцію, повернення каретки та новий рядок), використовуйте цей регулярний вираз.

    Візерунок : .*\s

    Особливо помітна різниця на багатострунних інструментах.

    Зніміть все перед першим пробілом

    Для того, щоб зіставити будь-що до першого пробілу в рядку, ви можете використовувати цей регулярний вираз:

    Візерунок : ^[^ ]* +

    З початку рядка ^ ми зіставляємо нуль або більше непропускних символів [^ ]*, за якими одразу слідує один або більше пропусків " +". Остання частина додається для того, щоб запобігти потенційним лідируючим пробілам в результатах.

    Для видалення тексту перед першим пропуском у кожному рядку формула записується в режимі "всі збіги" за замовчуванням ( instance_num опущено):

    =RegExpReplace(A5, "^[^ ]* +", "")

    Щоб видалити текст до першого пробілу в першому рядку, а всі інші рядки залишити без змін, необхідно виконати команду instance_num аргумент дорівнює 1:

    =RegExpReplace(A5, "^[^ ]* +", "", 1)

    Регекс для видалення всього, що стоїть перед символом

    Найпростіший спосіб видалити весь текст до певного символу - це використовувати такий реґекс:

    Загальна схема : ^[^char]*char

    У перекладі на людську мову це звучить так: "з початку рядка, закріпленого символом ^, збігаються 0 або більше символів, крім char - символ [^char]* до першої появи char - символ .

    Наприклад, щоб видалити весь текст до першого двокрапки, використовуйте цей регулярний вираз:

    Візерунок : ^[^:]*:

    Щоб уникнути початкових пробілів у результатах, додайте в кінці символ пробілу \s*. Це видалить все, що знаходиться перед першою двокрапкою, і обріже всі пробіли відразу після неї:

    Візерунок : ^[^:]*:\s*

    =RegExpReplace(A5, "^[^:]*:\s*", "")

    Порада. Крім регулярних виразів, в Excel є власні засоби для видалення тексту за позицією або збігом. Про те, як виконати завдання за допомогою вбудованих формул, читайте в статті Як видалити текст до або після символу в Excel.

    Regex, щоб видалити все, крім

    Щоб видалити з рядка всі символи, крім тих, які ви хочете зберегти, використовуйте заперечні класи символів.

    Наприклад, для видалення всіх символів, крім малих літер і крапок, використовується регекс:

    Візерунок : [^a-z\.]+

    Насправді, ми могли б обійтися без квантора +, оскільки наша функція замінює всі знайдені збіги. Квантор просто робить це трохи швидше - замість того, щоб обробляти кожен окремий символ, ви замінюєте підрядок.

    =RegExpReplace(A5, "[^a-z\.]+", "")

    Regex для видалення html-тегів в Excel

    Перш за все, слід зазначити, що HTML не є регулярною мовою, тому розбір його за допомогою регулярних виразів - не найкращий спосіб. Тим не менш, регекси, безумовно, можуть допомогти видалити теги з ваших комірок, щоб зробити ваш набір даних чистішим.

    Враховуючи, що html-теги завжди розміщуються в кутових дужках, знайти їх можна за допомогою одного з наступних реглексів.

    Негативний клас:

    Візерунок "Я не хочу, щоб ви знали, що я не хочу, щоб ви знали, що я не хочу, щоб ви знали;

    Тут ми зіставляємо відкриваючу кутову дужку, за якою слідує нуль або більше входжень будь-якого символу, крім закриваючої кутової дужки [^>]* до найближчої закриваючої кутової дужки.

    Лінивий пошук:

    Візерунок :

    Тут ми зіставляємо все, що знаходиться від першої відкриваючої дужки до першої закриваючої. Знак питання змушує .* зіставляти якомога менше символів, поки не знайде закриваючу дужку.

    Яку б схему ви не обрали, результат буде абсолютно однаковим.

    Наприклад, щоб видалити всі html-теги з рядка формату А5 і залишити текст, формула має вигляд:

    =RegExpReplace(A5, "]*>", "")

    Або можна скористатися лінивим квантором, як показано на скріншоті:

    Таке рішення відмінно працює для одного тексту (рядки 5 - 9). Для декількох текстів (рядки 10 - 12) результати сумнівні - тексти з різних тегів зливаються в один. Правильно це чи ні? Боюся, це не те, що можна вирішити однозначно - все залежить від вашого розуміння бажаного результату. Наприклад, в B11 очікується результат "A1", в той час як в B10 ви, можливо, хотіли б, щоб"дані1" та "дані2" відокремити пробілом.

    Щоб видалити html-теги і відокремити тексти, що залишилися, пробілами, можна діяти таким чином:

    1. Замінити теги пробілами " ", а не порожніми рядками:

      =RegExpReplace(A5, "]*>", " ")

    2. Зменшити кількість пробілів до одного символу пробілу:

      =RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")

    3. Підрівняти передні та задні проміжки:

      =TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "))

    Результат буде виглядати приблизно так:

    Ablebits Regex Remove Tool

    Якщо ви використовували наш Ultimate Suite для Excel, ви, ймовірно, вже відкрили для себе нові інструменти Regex, представлені в останньому випуску. Принадність цих функцій Regex на базі .NET полягає в тому, що вони, по-перше, підтримують повнофункціональний синтаксис регулярних виразів, вільний від обмежень VBA RegExp, а по-друге, не вимагають вставки будь-якого коду VBA в ваші робочі книги, оскільки вся інтеграція коду виконується автоматично.нами на бекенді.

    Ваша частина роботи полягає в тому, щоб побудувати регулярний вираз і подати його у функцію :) Давайте я покажу вам, як це зробити на практичному прикладі.

    Як видалити текст в дужках і дужках за допомогою regex

    У довгих текстових рядках менш важлива інформація часто укладена в [дужки] та (круглі дужки). Як видалити ці несуттєві деталі, зберігши всі інші дані?

    Фактично, ми вже побудували подібний регекс для видалення html-тегів, тобто тексту в кутових дужках. Очевидно, що такі ж методи будуть працювати і для квадратних і круглих дужок.

    Візерунок : (\(.*?\))

    Хитрість полягає у використанні лінивого квантора (*?) для пошуку найкоротшого можливого підрядка. Перша група (\(.*?\) відповідає будь-чому від відкриваючої дужки до першої закриваючої дужки. Друга група (\[.*?\]) відповідає будь-чому від відкриваючої дужки до першої закриваючої дужки. Вертикальна смужка

    Визначившись з шаблоном, давайте "згодуємо" його нашій функції Regex Remove. Ось як:

    1. Про це йдеться на Дані про абіти у вкладці Текст групу, натисніть Regex Tools .

  • Про це йдеться на Regex Tools виберіть вихідні рядки, введіть регекси, натисніть кнопку Видалити і натиснути на кнопку Видалити .

    Щоб отримати результати у вигляді формул, а не значень, виберіть Вставити як формулу прапорець.

    Для видалення тексту в дужках з рядків у форматі А2:А5 налаштовуємо параметри наступним чином:

  • Як наслідок, на сьогоднішній день AblebitsRegexRemove вставляється в новий стовпчик поруч з вашими вихідними даними.

    Функція також може бути введена безпосередньо в комірку за допомогою стандартного Функція вставки діалогове вікно, в якому вона віднесена до категорії AblebitsUDF .

    Як AblebitsRegexRemove призначена для видалення тексту, їй потрібно всього два аргументи - вихідний рядок і regex. Обидва параметри можуть бути задані безпосередньо у формулі або подані у вигляді посилань на комірки. При необхідності цю користувацьку функцію можна використовувати разом з будь-якими нативними.

    Наприклад, для обрізання зайвих пробілів в отриманих рядках можна використовувати функцію TRIM як обгортку:

    =TRIM(AblebitsRegexRemove(A5, $A$2))

    Ось так можна видаляти рядки в Excel за допомогою регулярних виразів. Дякую за прочитання і чекаю вас на нашому блозі наступного тижня!

    Доступні для завантаження

    Видалення рядків за допомогою regex - приклади (файл .xlsm)

    Ultimate Suite - пробна версія (файл .exe)

    Майкл Браун — відданий ентузіаст технологій із пристрастю до спрощення складних процесів за допомогою програмних засобів. Маючи понад десятирічний досвід роботи в технологічній індустрії, він відточив свої навички роботи з Microsoft Excel і Outlook, а також із Google Таблицями та Документами. Блог Майкла присвячений тому, щоб поділитися своїми знаннями та досвідом з іншими, надаючи прості поради та навчальні посібники для підвищення продуктивності та ефективності. Незалежно від того, чи є ви досвідченим професіоналом чи початківцем, блог Майкла пропонує цінну інформацію та практичні поради щодо отримання максимальної користі від цих основних програмних інструментів.