Прості трюки RegEx для початківців

Завжди хотів вивчити регулярні вислови, але збентежив їх складність? У цій статті я покажу вам п’ять простих у засвоєнні прийомів RegEx, які ви можете негайно розпочати використовувати у своєму улюбленому текстовому редакторі.

Налаштування текстового редактора

Хоча зараз майже будь-який текстовий редактор підтримує регулярні вирази, я буду використовувати Visual Studio Code для цього підручника, але ви можете використовувати будь-який редактор, який вам подобається. Крім того, зверніть увагу, що зазвичай вам потрібно ввімкнути RegEx десь поблизу пошукового вводу. Ось як ви це робите у VS Code:

1) . - Знайдіть будь-який символ

Почнемо просто. Символ крапки .відповідає будь-якому символу:

b.t

Над RegEx матчів "bot”, "bat”і будь-яке інше слово з трьох символів, починається з bі закінчується в t. Але якщо ви хочете шукати символ крапки, вам потрібно уникнути його \, так що цей RegEx буде відповідати лише точному тексту "b.t":

b\.t

2). * - Зіставити будь-що

Тут .означає "будь-який символ" і *означає "що-небудь до цього символу, повтореного будь-яку кількість разів". Разом ( .*) вони означають "будь-який символ будь-яку кількість разів". Ви можете використовувати його, наприклад, для пошуку збігів, які починаються з або закінчуються в якомусь тексті. Припустимо, у нас є метод javascript із таким підписом:

loadScript(scriptName: string, pathToFile: string)

І ми хочемо знайти всі виклики цього методу, де pathToFileвказує на будь-який файл у папці “lua”. Для цього ви можете використовувати наступний регулярний вираз:

loadScript.*lua

Що означає, "збігати весь текст, починаючи з “loadScript”чим-небудь до останнього входження “lua”"

3)? - Нежерливий матч

?Символ після того, як .*і деякі інші послідовності RegEx означає «матч якомога менше.» Якщо ви подивитесь на попередню картинку, то побачите, що текст “lua”бачиться двічі в кожному матчі, і все до другого “lua”збігалося. Якщо б ви хотіли порівняти все до першого входження "lua"замість цього, ви б використали такий RegEx:

loadScript.*?lua

Що означає, "поєднувати все, починаючи з, "loadScript"а потім щось до першого появи "lua""

4) () $ - Захоплення груп та зворотних посилань

Гаразд, тепер ми можемо зіставити текст. Але що, якщо ми хочемо змінити частини тексту, який ми знайшли? Для цього нам часто доводиться використовувати групи захоплення.

Припустимо, ми змінили наш loadScriptметод, і тепер йому раптово потрібен ще один аргумент, вставлений між двома аргументами. Давайте назвемо цей новий аргумент id, так що нова функція підпису повинна виглядати наступним чином : loadScript(scriptName, id, pathToFile). Тут ми не можемо використовувати функцію звичайної заміни нашого текстового редактора, але регулярний вираз - це саме те, що нам потрібно.

Вище ви можете побачити результат запуску такого регулярного виразу:

loadScript\(.*?,.*?\)

Що означає: "поєднуйте все, починаючи з, "loadScript("слідуючи за чим-небудь до першого ,, а потім за чим-небудь до першого )"

Єдине, що для вас може здатися дивним - це \символи. Вони використовуються для виходу з дужок.

Нам потрібно , щоб уникнути символів (і )тому , що вони є спеціальними символами , використовуваного RegEx для захоплення частини узгодженого тексту. Але нам потрібно збігати фактичні символи дужок.

У попередньому RegEx ми визначили два аргументи виклику нашого методу із .*?символами. Давайте зробимо кожен з наших аргументів окремий захоплення групи шляхом додавання (і )символів навколо них:

loadScript\((.*?),(.*?)\)

Якщо ви запустите цей RegEx, ви побачите, що нічого не змінилося. Це тому, що він відповідає одному тексту. Але тепер ми можемо посилатися на перший аргумент як, $1а на другий аргумент як $2. Це називається зворотним посиланням, і це допоможе нам робити те, що ми хочемо: додайте ще один аргумент в середині виклику:

Пошук:

loadScript\((.*?),(.*?)\)

Що означає те саме, що і попередній RegEx, але відображає аргументи для захоплення груп 1 і 2 відповідно.

Замінити введення:

loadScript($1,id,$2)

Що означає «замінити кожен відповідний текст текстом, “loadScript(“за яким слідують група захоплення 1, “id”група захоплення 2 та )». Зверніть увагу, що вам не потрібно виходити з дужок у вводі заміни.

5) [] - Класи персонажів

Ви можете перерахувати символи , які ви хочете , щоб відповідати в позиції , визначеної шляхом розміщення [і ]символів навколо цих символів. Наприклад, клас [0-9]відповідає всім цифрам від 0 до 9. Ви також можете явно перерахувати всі цифри: [0123456789]- значення однакове. Ви також можете використовувати тире з буквами, [a-z]відповідатиме будь-якому малому латиничному символу, [A-Z]відповідатиме будь-якому великому латинському символу і [a-zA-Z]відповідатиме обом.

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

Останнє слово

Ви повинні знати, що існує кілька ароматів RegEx. Я обговорював тут механізм javascript RegEx. Більшість сучасних двигунів схожі, але можуть бути деякі відмінності. Зазвичай ці відмінності включають символи втечі та позначки зворотних посилань.

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

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