Прости трикове 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 engine. Повечето съвременни двигатели са сходни, но може да има някои разлики. Обикновено тези разлики включват символи за бягство и обратни препратки.

Призовавам ви да отворите вашия текстов редактор и да започнете да използвате някои от тези трикове точно сега. Ще видите, че вече можете да изпълнявате много задачи за рефакторинг много по-бързо от преди. След като се почувствате добре с тези трикове, можете да започнете да изследвате повече в регулярни изрази.

Благодаря ви, че прочетохте статията ми до края. Добавете claps, ако сметнете за полезно и се абонирайте за още актуализации. Ще публикувам още статии за регулярни изрази, javascript и програмиране като цяло.