Turinys
Ar kada pagalvojote, kokia galinga būtų "Excel", jei kas nors galėtų praturtinti jos įrankių rinkinį reguliariosiomis išraiškomis? Mes ne tik galvojome, bet ir dirbome prie to :) Dabar galite pridėti šią nuostabią "RegEx" funkciją prie savo darbaknygių ir akimirksniu ištrinti šabloną atitinkančias eilutes!
Praėjusią savaitę apžvelgėme, kaip naudoti reguliarias išraiškas eilutėms pakeisti "Excel" programoje. Tam sukūrėme pasirinktinę funkciją "Regex Replace". Paaiškėjo, kad ši funkcija peržengia savo pagrindinę paskirtį ir gali ne tik pakeisti eilutes, bet ir jas pašalinti. Kaip tai galėtų būti? Kalbant apie "Excel", reikšmės pašalinimas yra ne kas kita, o jos pakeitimas tuščia eilute, ką mūsų funkcija "Regex" yralabai gerai!
VBA "RegExp" funkcija eilutėms pašalinti "Excel" programoje
Kaip visi žinome, "Excel" pagal nutylėjimą nepalaiko reguliariųjų išraiškų. Norėdami jas įjungti, turite sukurti savo vartotojo apibrėžtą funkciją. Gera žinia ta, kad tokia funkcija jau yra parašyta, išbandyta ir paruošta naudoti. Jums tereikia nukopijuoti šį kodą, įklijuoti jį į VBA redaktorių ir išsaugoti failą kaip darbaknygė su makrokomandomis (.xlsm).
Šios funkcijos sintaksė yra tokia:
RegExpReplace(tekstas, šablonas, pakeitimas, [instance_num], [match_case])Pirmieji trys argumentai yra privalomi, paskutiniai du - neprivalomi.
Kur:
- Tekstas - teksto eilutę, kurioje bus ieškoma.
- Modelis - ieškomą reguliariąją išraišką.
- Pakaitinis - tekstą, kurį reikia pakeisti. Į pašalinti posričių eilutes atitinka šabloną, naudokite tuščia eilutė (""), jei norite pakeisti.
- Instance_num (neprivaloma) - egzempliorius, kurį norima pakeisti. Jei nepateikiama, pakeičiami visi rasti atitikmenys (numatytoji reikšmė).
- Match_case (neprivaloma) - loginė reikšmė, nurodanti, ar teksto raidės turi būti sutapatinamos, ar ignoruojamos. Jei norite, kad būtų sutapatinama su didžiosiomis raidėmis, naudokite TRUE (numatytoji reikšmė); jei norite, kad nebūtų sutapatinama su didžiosiomis raidėmis, naudokite FALSE.
Daugiau informacijos rasite dalyje Funkcija RegExpReplace.
Patarimas. Paprastais atvejais galite pašalinti tam tikrus simbolius ar žodžius iš ląstelių naudodami "Excel" formules. Tačiau reguliariosios išraiškos suteikia kur kas daugiau galimybių.
Kaip pašalinti eilutes naudojant reguliarias išraiškas - pavyzdžiai
Kaip minėta, norėdami pašalinti teksto dalis, atitinkančias šabloną, turite jas pakeisti tuščia eilute. Taigi, bendroji formulė įgauna tokią formą:
RegExpReplace(tekstas, šablonas, "", [instance_num], [match_case])Toliau pateiktuose pavyzdžiuose pateikiami įvairūs šios pagrindinės koncepcijos įgyvendinimo būdai.
Pašalinti visus atitikmenis arba konkretų atitikmenį
Funkcija "RegExpReplace" skirta surasti visas posistemes, atitinkančias duotą regex. Kuriuos atvejus pašalinti, nustatoma pagal 4-ąjį pasirenkamąjį argumentą, pavadintą instance_num .
Numatytoji reikšmė yra "visi atitikmenys" - kai instance_num argumentas praleidžiamas, pašalinami visi rasti atitikmenys. Jei norite ištrinti konkretų atitikmenį, nurodykite jo numerį.
Tarkime, kad toliau pateiktose eilutėse norite ištrinti pirmosios eilės numerį. Visi tokie numeriai prasideda hash ženklu (#) ir juose yra lygiai 5 skaitmenys. Taigi, juos galime identifikuoti naudodami šią regeksę:
Modelis : #\d{5}\b
Žodžių riba \b nurodo, kad atitinkanti poaibis negali būti didesnės eilutės, pavyzdžiui, #10000001, dalis.
Jei norite pašalinti visus atitikmenis, naudokite instance_num argumentas nėra apibrėžtas:
=RegExpReplace(A5, "#\d{5}\b", "")
Norėdami išnaikinti tik pirmąjį atvejį, nustatome instance_num argumentą į 1:
=RegExpReplace(A5, "#\d{5}\b", "", 1)
"Regex" tam tikriems simboliams pašalinti
Norėdami iš eilutės pašalinti tam tikrus simbolius, tiesiog surašykite visus nepageidaujamus simbolius ir atskirkite juos vertikaliu brūkšniu.
Pavyzdžiui, norėdami standartizuoti įvairiais formatais užrašytus telefono numerius, pirmiausia atsikratome tam tikrų simbolių, pavyzdžiui, skliaustų, brūkšnelių, taškų ir baltųjų tarpų.
Modelis : \(
=RegExpReplace(A5, "\(
Šios operacijos rezultatas yra 10 skaitmenų skaičius, pavyzdžiui, "1234567890".
Kad būtų patogiau, regeksą galite įvesti atskiroje ląstelėje, o į tą ląstelę nukreipti naudodami absoliučią nuorodą, pavyzdžiui, $A$2:
=RegExpReplace(A5, $A$2, "")
Formatavimą galite standartizuoti taip, kaip norite, naudodami jungimo operatorių (&) ir teksto funkcijas, pavyzdžiui, RIGHT, MID ir LEFT.
Pavyzdžiui, norint visus telefono numerius užrašyti formatu (123) 456-7890, formulė yra tokia:
="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)
Kur B5 yra RegExpReplace funkcijos išvestis.
Specialiųjų simbolių pašalinimas naudojant regex
Vienoje iš mūsų pamokų apžvelgėme, kaip pašalinti nepageidaujamus simbolius "Excel" programoje naudojant integruotas ir pasirinktines funkcijas. Reguliariosios išraiškos gerokai palengvina darbą! Užuot išvardiję visus šalintinus simbolius, tiesiog nurodykite tuos, kuriuos norite išsaugoti :)
Modelis pagrįstas neigiamų simbolių klasės - caret dedamas į simbolių klasės [^ ] vidų, kad atitiktų bet kurį atskirą simbolį, kuris NĖRA skliausteliuose. Kvantifikatorius + priverčia laikyti iš eilės einančius simbolius vienu atitikmeniu, kad būtų pakeista atitinkanti poaibė, o ne kiekvienas atskiras simbolis.
Atsižvelgdami į savo poreikius, pasirinkite vieną iš šių regeksų.
Pašalinti ne raidžių ir skaičių ženklai, t. y. visi ženklai, išskyrus raides ir skaitmenis:
Modelis : [^0-9a-zA-Z]+
Jei norite išvalyti visus simbolius išskyrus raides , skaitmenys ir erdvės :
Modelis : [^0-9a-zA-Z ]+
Visų simbolių ištrynimas išskyrus raides , skaitmenys ir pabraukimas , galite naudoti \W, kuris reiškia bet kokį simbolį, kuris NĖRA raidinis-skaitmeninis simbolis arba paryškinamasis simbolis:
Modelis : \W+
Jei norite išlaikyti kai kuriuos kitus simbolius. skyrybos ženklus, dėkite juos į skliaustelius.
Pavyzdžiui, jei norite pašalinti bet kokį kitą simbolį, išskyrus raidę, skaitmenį, tašką, kablelį ar tarpą, naudokite šią regex formuluotę:
Modelis : [^0-9a-zA-Z\., ]+
Taip sėkmingai pašalinami visi specialieji simboliai, tačiau lieka papildomų baltųjų simbolių.
Norėdami tai ištaisyti, galite pirmiau minėtą funkciją įterpti į kitą funkciją, kuri kelis tarpelius pakeičia vienu tarpo ženklu.
=RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")
Arba tiesiog naudokite gimtąją TRIM funkciją ir pasieksite tą patį efektą:
=TRIM(RegExpReplace(A5, $A$2, ""))
"Regex" neįskaitiniams simboliams pašalinti
Norėdami ištrinti visus neskaitmeninius simbolius iš eilutės, galite naudoti šią ilgą formulę arba vieną iš toliau išvardytų labai paprastų regeksų.
Atitinka bet kurį simbolį, kuris NĖRA skaitmuo:
Modelis : \D+
Nereikšmingų ženklų pašalinimas naudojant neigiamas klases:
Modelis : [^0-9]+
Modelis : [^\d]+
Patarimas. Jei jūsų tikslas yra pašalinti tekstą ir likusius skaičius išskirstyti į atskiras ląsteles arba visus juos patalpinti į vieną ląstelę, atskirtą nurodytu skiriamuoju ženklu, naudokite funkciją RegExpExtract, kaip paaiškinta skyrelyje Kaip išgauti skaičius iš eilutės naudojant reguliariąsias išraiškas.
Regex, kad pašalintumėte viską po tarpo
Norėdami ištrinti viską, kas yra po tarpo, naudokite tarpą ( ) arba baltąjį tarpą (\s), kad rastumėte pirmąjį tarpą, o .* - visus po jo esančius simbolius.
Jei turite vienos eilutės eilutes, kuriose yra tik įprasti tarpai (32 reikšmė 7 bitų ASCII sistemoje), nėra labai svarbu, kurį iš toliau nurodytų regeksų naudosite. Jei eilutės yra kelių eilučių, tai turi reikšmės.
Norėdami viską pašalinti po tarpo simbolio , naudokite šią regeksą:
Modelis : " .*"
=RegExpReplace(A5, " .*", "")
Pagal šią formulę bus išbraukta viskas, kas yra po pirmojo tarpo kiekviena eilutė . Kad rezultatai būtų rodomi teisingai, būtinai įjunkite "Wrap Text".
Viską nuimti po baltosios eilutės (įskaitant tarpą, skirtuką, grįžtamąjį klavišą ir naują eilutę), regeksas yra:
Modelis : \s.*
=RegExpReplace(A5, "\s.*", "")
Kadangi \s atitinka kelis skirtingus baltųjų ženklų tipus, įskaitant nauja eilutė (\n), ši formulė ištrina viską, kas yra po pirmojo tarpo ląstelėje, nesvarbu, kiek joje yra eilučių.
"Regex", skirta pašalinti tekstą po tam tikro simbolio
Naudodami ankstesniame pavyzdyje nurodytus metodus, galite ištrinti tekstą po bet kurio nurodyto simbolio.
Norėdami tvarkyti kiekvieną eilutę atskirai:
Bendrasis modelis : char.*
Vienos eilutės eilutėse bus pašalinta viskas, kas yra po simbolis . Kelių eilučių eilutėse kiekviena eilutė bus apdorojama atskirai, nes VBA "Regex" skonyje taškas (.) atitinka bet kurį simbolį, išskyrus naują eilutę.
Jei norite apdoroti visas eilutes kaip vieną eilutę:
Bendrasis modelis : char(.
Norint ištrinti viską, kas yra po tam tikro simbolio, įskaitant naujas eilutes, prie šablono pridedamas \n.
Pavyzdžiui, norėdami pašalinti tekstą po pirmojo kablelio eilutėje, išbandykite šias reguliarias išraiškas:
Modelis : ,.*
Modelis : ,(.
Toliau pateiktoje ekrano nuotraukoje matote, kaip skiriasi rezultatai.
Regex, kad pašalintumėte viską, kas yra prieš tarpą
Dirbdami su ilgomis teksto eilutėmis, kartais galite norėti jas sutrumpinti pašalindami tą pačią informacijos dalį iš visų langelių. Toliau aptarsime du tokius atvejus.
Pašalinkite viską, kas yra prieš paskutinį tarpą
Kaip ir ankstesniame pavyzdyje, reguliarioji išraiška priklauso nuo to, kaip suprantate "tarpą".
Jei norite suderinti ką nors su paskutinė vieta (kabutės dedamos tam, kad tarpas po žvaigždutės būtų pastebimas).
Modelis : ".* "
Jei norite, kad atitiktų viską, kas yra prieš paskutinis baltasis tarpas (įskaitant tarpą, skirtuką, grįžtamąjį klavišą ir naują eilutę), naudokite šią reguliariąją išraišką.
Modelis : .*\s
Skirtumas ypač pastebimas daugiajuostėse eilutėse.
Pašalinkite viską, kas yra prieš pirmąjį tarpą
Jei norite, kad eilutėje sutaptų bet kas iki pirmojo tarpo, galite naudoti šią reguliariąją išraišką:
Modelis : ^[^ ]* +
Nuo eilutės ^ pradžios sutinkame nulį ar daugiau simbolių be tarpo [^ ]*, po kurių iš karto eina vienas ar daugiau tarpų " +". Paskutinė dalis pridedama siekiant išvengti galimų pradinių tarpų rezultatuose.
Norint pašalinti tekstą prieš pirmą tarpą kiekvienoje eilutėje, formulė rašoma numatytuoju "visų atitikmenų" režimu ( instance_num praleista):
=RegExpReplace(A5, "^[^ ]* +", "")
Jei norite ištrinti tekstą iki pirmojo tarpo pirmoje eilutėje, o visas kitas eilutes palikti nepakeistas, naudokite instance_num argumentas yra lygus 1:
=RegExpReplace(A5, "^[^ ]* +", "", 1)
Regex, kad būtų pašalinta viskas, kas yra prieš simbolį
Lengviausias būdas pašalinti visą tekstą prieš tam tikrą simbolį - naudoti tokią regex formulę:
Bendrasis modelis : ^[^char]*char
Išvertus į žmonių kalbą, čia rašoma: "nuo eilutės, pažymėtos ženklu ^, pradžios sutapkite su 0 ar daugiau simbolių, išskyrus simbolis [^char]* iki pirmosios reikšmės simbolis .
Pavyzdžiui, norėdami ištrinti visą tekstą iki pirmojo dvitaškio, naudokite šią reguliariąją išraišką:
Modelis : ^[^:]*:
Kad rezultatuose būtų išvengta pradinių tarpų, pabaigoje pridėkite baltąjį simbolį \s*. Tai pašalins viską, kas yra prieš pirmąjį dvitaškį, ir iškart po jo ištrins visus tarpus:
Modelis : ^[^:]*:\s*
=RegExpReplace(A5, "^[^:]*:\s*", "")
Patarimas. Be reguliariųjų išraiškų, "Excel" turi savo priemones tekstui pašalinti pagal padėtį arba atitikimą. Norėdami sužinoti, kaip atlikti šią užduotį naudojant vietines formules, skaitykite straipsnį Kaip pašalinti tekstą prieš arba po simbolio "Excel" programoje.
Regex pašalinti viską, išskyrus
Norėdami ištrinti iš eilutės visus simbolius, išskyrus tuos, kuriuos norite išsaugoti, naudokite neigiamų simbolių klases.
Pavyzdžiui, norint pašalinti visus simbolius, išskyrus mažąsias raides ir taškus, regeksas yra toks:
Modelis : [^a-z\.]+
Tiesą sakant, galėtume apsieiti ir be kvantifikatoriaus +, nes mūsų funkcija pakeičia visus rastus atitikmenis. Kvantifikatorius tik šiek tiek pagreitina darbą - užuot tvarkę kiekvieną atskirą simbolį, pakeičiame pojuostę.
=RegExpReplace(A5, "[^a-z\.]+", "")
"Regex" html žymėms pašalinti "Excel" programoje
Pirmiausia reikėtų pažymėti, kad HTML nėra taisyklinga kalba, todėl jos analizė naudojant reguliariąsias išraiškas nėra geriausias būdas. Vis dėlto regeksai tikrai gali padėti pašalinti žymas iš langelių, kad duomenų rinkinys būtų švaresnis.
Atsižvelgiant į tai, kad html žymos visada dedamos kampiniuose skliaustuose , jas galite rasti naudodami vieną iš šių regeksų.
Neigiama klasė:
Modelis : ]*>
Šiuo atveju sutinkamas pradinis kampinis skliaustas, po kurio eina nulis ar daugiau bet kokių simbolių, išskyrus uždaromąjį kampinį skliaustą [^>]*, iki artimiausio uždaromojo kampinio skliausto.
Tingios paieškos:
Modelis :
Šiuo atveju sutinkame bet ką nuo pirmojo pradinio skliausto iki pirmojo uždaromojo skliausto. Klausimo ženklas verčia .* sutinkinti kuo mažiau simbolių, kol randa uždaromąjį skliaustą.
Kad ir kokį modelį pasirinktumėte, rezultatas bus visiškai toks pat.
Pavyzdžiui, norint iš A5 eilutės pašalinti visas html žymas ir palikti tekstą, formulė yra tokia:
=RegExpReplace(A5, "]*>", "")
Arba galite naudoti lėtąjį kvantifikatorių, kaip parodyta paveikslėlyje:
Šis sprendimas puikiai tinka vienam tekstui (5-9 eilutės). Kelių tekstų atveju (10-12 eilutės) rezultatai kelia abejonių - skirtingų žymų tekstai sujungiami į vieną. Ar tai teisinga, ar ne? Bijau, kad tai nėra tai, ką galima lengvai nuspręsti - viskas priklauso nuo jūsų supratimo apie norimą rezultatą. Pavyzdžiui, B11 eilutėje tikimasi rezultato "A1", o B10 eilutėje galite norėti"data1" ir "data2" turi būti atskirti tarpais.
Norėdami pašalinti html žymas ir atskirti likusius tekstus tarpais, galite elgtis taip:
- Pakeiskite žymas tarpais " ", o ne tuščiomis eilutėmis:
=RegExpReplace(A5, "]*>", " ")
- Sumažinkite kelis tarpelius iki vieno tarpo simbolio:
=RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")
- Apipjaustykite pradinius ir galinius tarpus:
=TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "))
Rezultatas atrodys maždaug taip:
"Ablebits Regex" pašalinimo įrankis
Jei turėjote galimybę naudoti mūsų "Ultimate Suite for Excel", tikriausiai jau atradote naujus "Regex" įrankius, pristatytus su naujausia versija. Šių .NET pagrįstų "Regex" funkcijų grožis yra tas, kad, pirma, jos palaiko visavertę reguliariųjų išraiškų sintaksę be VBA RegExp apribojimų, ir, antra, į darbaknyges nereikia įterpti jokio VBA kodo, nes visas kodas integruojamas.mums iš galo.
Jūsų užduotis - sudaryti reguliariąją išraišką ir pateikti ją funkcijai :) Parodysiu, kaip tai padaryti praktiniame pavyzdyje.
Kaip pašalinti tekstą skliaustuose ir skliausteliuose naudojant regex
Ilgose teksto eilutėse mažiau svarbi informacija dažnai būna pateikta [skliaustuose] ir (skliausteliuose). Kaip pašalinti šias nereikšmingas detales, išsaugant visus kitus duomenis?
Tiesą sakant, jau sukūrėme panašią regex, skirtą html žymėms, t. y. tekstui, esančiam kampiniuose skliaustuose, ištrinti. Akivaizdu, kad tie patys metodai tiks ir kvadratiniams bei apvaliems skliaustams.
Modelis : (\(.*?\))
Apgaulė yra ta, kad naudojant tingus kvantifikatorius (*?) galima rasti trumpiausią įmanomą posistemę. Pirmoji grupė (\(.*?\)) atitinka bet ką nuo pradinio skliausto iki pirmojo uždaromojo skliausto. Antroji grupė (\[.*?\]) atitinka bet ką nuo pradinio skliausto iki pirmojo uždaromojo skliausto. Vertikalus brūkšnelis
Nustatę šabloną, "paduokime" jį savo "Regex Remove" funkcijai. Štai kaip:
- Dėl Ablebitų duomenys skirtuke Tekstas grupę, spustelėkite "Regex" įrankiai .
Jei norite gauti rezultatus kaip formules, o ne kaip reikšmes, pasirinkite Įterpti kaip formulę žymimasis langelis.
Norėdami pašalinti tekstą skliausteliuose iš A2:A5 eilučių, nustatymus konfigūruojame taip:
Dėl to AblebitsRegexRemove funkcija įterpiama į naują stulpelį šalia pradinių duomenų.
Funkciją taip pat galima įvesti tiesiogiai ląstelėje naudojant standartinę Įterpimo funkcija dialogo langą, kuriame jis priskiriamas kategorijai AblebitsUDFs .
Kaip AblebitsRegexRemove skirta tekstui pašalinti, jai reikia tik dviejų argumentų - pradinės eilutės ir regex. Abu parametrai gali būti apibrėžti tiesiogiai formulėje arba pateikti langelių nuorodų pavidalu. Jei reikia, šią pasirinktinę funkciją galima naudoti kartu su bet kuriomis vietinėmis funkcijomis.
Pavyzdžiui, norėdami apkarpyti papildomus tarpus gautose eilutėse, galite naudoti TRIM funkciją kaip apvalkalą:
=TRIM(AblebitsRegexRemove(A5, $A$2))
Štai kaip pašalinti eilutes "Excel" programoje naudojant reguliarias išraiškas. Dėkoju, kad perskaitėte, ir laukiu jūsų mūsų tinklaraštyje kitą savaitę!
Galimi atsisiuntimai
Eilučių šalinimas naudojant regex - pavyzdžiai (.xlsm failas)
"Ultimate Suite" - bandomoji versija (.exe failas)