Sisällysluettelo
Oletko koskaan ajatellut, kuinka tehokas Excel olisi, jos joku voisi rikastuttaa sen työkalupakkia säännöllisillä lausekkeilla? Emme ole vain ajatelleet, vaan työskennelleet sen parissa :) Ja nyt voit lisätä tämän ihanan RegEx-toiminnon omiin työkirjoihisi ja pyyhkiä kuvion mukaisia merkkijonoja hetkessä!
Viime viikolla tarkastelimme, miten säännöllisiä lausekkeita voidaan käyttää merkkijonojen korvaamiseen Excelissä. Tätä varten loimme mukautetun Regex Replace -funktion. Kuten kävi ilmi, funktio ylittää sen ensisijaisen käyttötarkoituksen ja voi paitsi korvata merkkijonoja myös poistaa niitä. Miten se on mahdollista? Excelin kannalta arvon poistaminen ei ole mitään muuta kuin sen korvaaminen tyhjällä merkkijonolla, mitä Regex-funktiomme onerittäin hyvä!
VBA RegExp -toiminto osajonojen poistamiseksi Excelissä
Kuten kaikki tiedämme, säännöllisiä lausekkeita ei tueta Excelissä oletusarvoisesti. Niiden käyttöön ottamiseksi sinun on luotava oma käyttäjän määrittelemä funktio. Hyvä uutinen on, että tällainen funktio on jo kirjoitettu, testattu ja valmis käytettäväksi. Sinun tarvitsee vain kopioida tämä koodi, liittää se VBA-editoriin ja tallentaa tiedosto tiedostona nimellä makrotoiminnoilla varustettu työkirja (.xlsm).
Funktio on syntaksiltaan seuraava:
RegExpReplace(text, pattern, replacement, [instance_num], [match_case])Kolme ensimmäistä argumenttia ovat pakollisia, kaksi viimeistä ovat valinnaisia.
Missä:
- Teksti - tekstijono, josta haetaan.
- Kuvio - etsittävä säännöllinen lauseke.
- Korvaava - teksti, jolla korvataan. To poistaa osajonoja joka vastaa mallia, käytä tyhjä merkkijono ("") vaihtoa varten.
- Instance_num (valinnainen) - korvattava instanssi. Jos se jätetään pois, kaikki löydetyt osumat korvataan (oletusarvo).
- Match_case (valinnainen) - boolen arvo, joka osoittaa, onko tekstin iso- ja pienaakkoset otettava huomioon vai jätettävä huomiotta. Jos haluat käyttää iso- ja pienaakkoset huomioivaa täsmäytystä, käytä TRUE (oletusarvo); jos haluat jättää huomiotta iso- ja pienaakkoset - FALSE.
Lisätietoja on kohdassa RegExpReplace-funktio.
Vihje. Yksinkertaisissa tapauksissa voit poistaa tiettyjä merkkejä tai sanoja soluista Excel-kaavoilla. Säännölliset lausekkeet tarjoavat kuitenkin paljon enemmän vaihtoehtoja.
Merkkijonojen poistaminen säännöllisillä lausekkeilla - esimerkkejä
Kuten edellä mainittiin, jos haluat poistaa tekstin osat, jotka vastaavat mallia, sinun on korvattava ne tyhjällä merkkijonolla. Yleinen kaava on siis seuraavanlainen:
RegExpReplace(text, pattern, "", [instance_num], [match_case])Seuraavat esimerkit osoittavat tämän peruskäsitteen eri toteutuksia.
Poista kaikki ottelut tai tietty ottelu
RegExpReplace-funktio on suunniteltu etsimään kaikki osajonot, jotka vastaavat annettua regexiä. Se, mitkä esiintymät poistetaan, määräytyy neljännen valinnaisen argumentin avulla, jonka nimi on instance_num .
Oletusarvo on "kaikki ottelut" - kun oletusarvona on instance_num argumentti jätetään pois, kaikki löydetyt osumat poistetaan. Jos haluat poistaa tietyn osuman, määritä sen numero.
Oletetaan, että alla olevista merkkijonoista halutaan poistaa ensimmäinen järjestysnumero. Kaikki tällaiset numerot alkavat hash-merkillä (#) ja sisältävät täsmälleen 5 numeroa. Voimme siis tunnistaa ne käyttämällä tätä regexiä:
Kuvio : #\d{5}\b
Sanan raja \b määrittää, että vastaava merkkijono ei voi olla osa suurempaa merkkijonoa, kuten #10000001.
Jos haluat poistaa kaikki osumat, valitse instance_num argumenttia ei ole määritelty:
=RegExpReplace(A5, "#\d{5}\b", "")
Jos haluamme poistaa vain ensimmäisen esiintymän, asetamme parametrin instance_num argumentin arvoksi 1:
=RegExpReplace(A5, "#\d{5}\b", "", 1)
Regex tiettyjen merkkien poistamiseksi
Jos haluat poistaa tietyt merkit merkkijonosta, kirjoita kaikki ei-toivotut merkit ylös ja erota ne toisistaan pystyviivalla.
Esimerkiksi eri muodoissa kirjoitettujen puhelinnumeroiden standardoimiseksi poistetaan ensin tietyt merkit, kuten sulkeet, väliviivat, pisteet ja välilyönnit.
Kuvio : \(
=RegExpReplace(A5, "\(
Tämän operaation tulos on 10-numeroinen numero, kuten "1234567890".
Yksinkertaisuuden vuoksi voit syöttää regexin erilliseen soluun ja viitata soluun absoluuttisella viittauksella, kuten $A$2:
=RegExpReplace(A5, $A$2, "")
Sitten voit vakioida muotoilun haluamallasi tavalla käyttämällä ketjutusoperaattoria (&) ja tekstifunktioita, kuten RIGHT, MID ja LEFT.
Jos esimerkiksi haluat kirjoittaa kaikki puhelinnumerot muodossa (123) 456-7890, kaava on seuraava:
="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)
B5 on RegExpReplace-funktion tuloste.
Erikoismerkkien poistaminen regexin avulla
Eräässä opetusohjelmassamme tarkastelimme, miten poistaa ei-toivottuja merkkejä Excelissä käyttämällä sisäänrakennettuja ja mukautettuja funktioita. Säännölliset lausekkeet helpottavat asioita huomattavasti! Sen sijaan, että luetteloisit kaikki poistettavat merkit, määritä vain ne, jotka haluat säilyttää :)
Kuvio perustuu kielletyt merkkiluokat - merkkiluokan [^ ] sisälle laitetaan karetti, joka vastaa mitä tahansa yksittäistä merkkiä, joka EI ole suluissa. Kvantifikaattori + pakottaa sen pitämään peräkkäisiä merkkejä yhtenä vastaavuutena, joten korvaus tehdään vastaavalle osajonolle eikä jokaiselle yksittäiselle merkille.
Valitse jokin seuraavista regexeistä tarpeidesi mukaan.
Poistaaksesi muut kuin aakkosnumeeriset merkit, eli kaikki merkit lukuun ottamatta kirjaimia ja numeroita:
Kuvio : [^0-9a-zA-Z]+
Kaikkien merkkien poistaminen paitsi kirjaimet , numerot ja tilat :
Kuvio : [^0-9a-zA-Z ]+
Kaikkien merkkien poistaminen paitsi kirjaimet , numerot ja alleviivaus , voit käyttää \W-merkkiä, joka tarkoittaa mitä tahansa merkkiä, joka EI ole aakkosnumeerinen merkki tai alleviivaus:
Kuvio : \W+
Jos haluat pitää joitakin muita hahmoja esimerkiksi välimerkit, laita ne sulkujen sisään.
Jos haluat esimerkiksi poistaa kaikki muut merkit kuin kirjaimet, numerot, pisteet, pilkut tai välilyönnit, käytä seuraavaa regexiä:
Kuvio : [^0-9a-zA-Z\., ]+
Tämä poistaa onnistuneesti kaikki erikoismerkit, mutta ylimääräinen välilyönti jää jäljelle.
Voit korjata tämän lisäämällä yllä olevan funktion toiseen funktioon, joka korvaa useita välilyöntejä yhdellä välilyöntimerkillä.
=RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")
Tai käytä vain alkuperäistä TRIM-toimintoa, jolla on sama vaikutus:
=TRIM(RegExpReplace(A5, $A$2, "")))
Regex muiden kuin numeeristen merkkien poistamiseksi
Jos haluat poistaa kaikki muut kuin numeeriset merkit merkkijonosta, voit käyttää joko tätä pitkää kaavaa tai jotakin alla luetelluista hyvin yksinkertaisista regexeistä.
Sopii mihin tahansa merkkiin, joka EI ole numero:
Kuvio : \D+
Poistaa muut kuin numeeriset merkit käyttämällä negaatioluokkia:
Kuvio : [^0-9]+
Kuvio : [^\d]+
Vihje. Jos tavoitteenasi on poistaa teksti ja siirtää jäljelle jäävät numerot erillisiin soluihin tai sijoittaa ne kaikki yhteen soluun, joka on erotettu määritetyllä erottimella, käytä RegExpExtract-funktiota, kuten selitetään kohdassa Numeroiden poimiminen merkkijonosta säännöllisillä lausekkeilla.
Regex poistaa kaiken välilyönnin jälkeen
Jos haluat poistaa kaiken välilyönnin jälkeen, käytä joko välilyöntiä ( ) tai välilyöntiä (\s) ensimmäisen välilyönnin etsimiseen ja .*-merkkiä kaikkien sen jälkeisten merkkien etsimiseen.
Jos sinulla on yksirivisiä merkkijonoja, jotka sisältävät vain tavallisia välilyöntejä (arvo 32 7-bittisessä ASCII-järjestelmässä), ei ole väliä, kumpaa alla olevista regexeistä käytät. Jos kyseessä on monirivinen merkkijono, sillä on merkitystä.
Kaiken poistaminen välilyönnin jälkeen , käytä tätä regexiä:
Kuvio : " .*"
=RegExpReplace(A5, " .*", "")
Tämä kaava poistaa kaiken ensimmäisen välilyönnin jälkeisen kohdan jokainen rivi Jotta tulokset näkyvät oikein, varmista, että tekstin kääriminen on päällä.
Riisua kaikki pois välilyönnin jälkeen (mukaan lukien välilyönti, tabulaattori, rivinvaihto ja uusi rivi), regex on:
Kuvio : \s.*
=RegExpReplace(A5, "\s.*", "")
Koska \s sopii muutamiin eri välilyönnityyppeihin, kuten uusi linja (\n), tämä kaava poistaa kaiken solun ensimmäisen välilyönnin jälkeen, riippumatta siitä, kuinka monta riviä solussa on.
Regex poistaa tekstin tietyn merkin jälkeen
Käyttämällä edellisen esimerkin menetelmiä voit poistaa tekstin minkä tahansa määrittämäsi merkin jälkeen.
Käsitelläksesi jokaista riviä erikseen:
Yleinen malli : char.*
Yksirivisissä merkkijonoissa tämä poistaa kaiken sen jälkeen, kun char Monirivisissä merkkijonoissa jokainen rivi käsitellään erikseen, koska VBA:n Regex-makua käytettäessä piste (.) vastaa mitä tahansa merkkiä paitsi uutta riviä.
Käsitellä kaikki rivit yhtenä merkkijonona:
Yleinen malli : char(.
Jos haluat poistaa kaiken tietyn merkin jälkeen, mukaan lukien uudet rivit, kuvioon lisätään \n.
Jos haluat esimerkiksi poistaa merkkijonon ensimmäisen pilkun jälkeisen tekstin, kokeile näitä säännöllisiä lausekkeita:
Kuvio : ,.*
Kuvio : ,(.
Alla olevasta kuvakaappauksesta näet, miten tulokset eroavat toisistaan.
Regex poistaa kaiken ennen välilyöntiä
Kun työskentelet pitkien tekstikatkelmien kanssa, saatat joskus haluta lyhentää niitä poistamalla saman tiedon osan kaikista soluista. Seuraavassa käsitellään kahta tällaista tapausta.
Poista kaikki ennen viimeistä välilyöntiä
Kuten edellisessä esimerkissä, säännöllinen lauseke riippuu siitä, miten ymmärrät "välilyönnin".
Jos haluat sovittaa mitä tahansa jopa viimeinen tila , tämä regex riittää (lainausmerkit on lisätty, jotta välilyönti tähtimerkin jälkeen on havaittavissa).
Kuvio : ".* "
Vastaamaan mitä tahansa ennen viimeinen välilyönti (mukaan lukien välilyönti, tabulaattori, rivinvaihto ja uusi rivi), käytä tätä säännöllistä lauseketta.
Kuvio : .*\s
Ero on erityisen huomattava monirivisissä merkkijonoissa.
Poistetaan kaikki ennen ensimmäistä välilyöntiä
Voit käyttää tätä säännöllistä lauseketta, kun haluat löytää mitä tahansa merkkijonon ensimmäiseen välilyöntiin asti:
Kuvio : ^[^ ]* +
Merkkijonon ^ alusta alkaen täsmäämme nollaan tai useampaan muuhun kuin välilyöntiin perustuvaan merkkiin [^ ]*, joita seuraa välittömästi yksi tai useampi välilyönti " +". Viimeinen osa lisätään, jotta estetään mahdolliset johtavat välilyönnit tuloksissa.
Jos haluat poistaa tekstin ennen ensimmäistä välilyöntiä kullakin rivillä, kaava kirjoitetaan oletusarvoisesti "kaikki osumat" -tilassa ( instance_num jätetty pois):
=RegExpReplace(A5, "^[^ ]* +", "")
Jos haluat poistaa tekstin ennen ensimmäistä välilyöntiä ensimmäiseltä riviltä ja jättää kaikki muut rivit ennalleen, käytä komentoa instance_num argumentin arvoksi asetetaan 1:
=RegExpReplace(A5, "^[^ ]* +", "", 1)
Regex poistaa kaiken ennen merkkiä
Helpoin tapa poistaa kaikki teksti ennen tiettyä merkkiä on käyttää tällaista regexiä:
Yleinen malli : ^[^char]*char
Ihmiskielelle käännettynä se sanoo: "merkkijonon alusta, joka on ankkuroitu ^:llä, vastaa 0 tai useampaa merkkiä paitsi char [^char]* seuraavaan ensimmäiseen esiintymään asti. char .
Jos haluat esimerkiksi poistaa kaiken tekstin ennen ensimmäistä kaksoispistettä, käytä tätä säännöllistä lauseketta:
Kuvio : ^[^:]*:
Jos haluat välttää johtavat välilyönnit tuloksissa, lisää loppuun välilyöntimerkki \s*. Tämä poistaa kaiken ennen ensimmäistä kaksoispistettä ja leikkaa kaikki välilyönnit heti sen jälkeen:
Kuvio : ^[^:]*:\s*
=RegExpReplace(A5, "^[^:]*:\s*", "")
Vihje. Säännöllisten lausekkeiden lisäksi Excelillä on omat keinonsa tekstin poistamiseen sijainnin tai vastaavuuden perusteella. Jos haluat oppia, miten tehtävä voidaan suorittaa natiivien kaavojen avulla, katso kohta Tekstin poistaminen ennen tai jälkeen merkin Excelissä.
Regex poistaa kaiken paitsi
Jos haluat poistaa merkkijonosta kaikki merkit paitsi ne, jotka haluat säilyttää, käytä negaatioluokkia.
Esimerkiksi, jos haluat poistaa kaikki merkit paitsi pienet kirjaimet ja pisteet, regex on:
Kuvio : [^a-z\.]+
Itse asiassa voisimme pärjätä ilman +-kvantifikaattoria, koska funktiomme korvaa kaikki löydetyt osumat. Kvantifikaattori vain nopeuttaa toimintaa hieman - sen sijaan, että käsittelisit jokaista yksittäistä merkkiä, korvaat osajonon.
=RegExpReplace(A5, "[^a-z\.]+", "")
Regex poistaa html-tunnisteet Excelissä
Ensinnäkin on huomattava, että HTML ei ole säännöllinen kieli, joten sen jäsentäminen säännöllisillä lausekkeilla ei ole paras tapa. Tästä huolimatta regexit voivat varmasti auttaa poistamaan tunnisteet soluista, jotta tietokokonaisuudesta tulee siistimpi.
Koska html-tunnisteet on aina sijoitettu hakasulkeisiin , voit löytää ne käyttämällä jotakin seuraavista regexeistä.
Negatiivinen luokka:
Kuvio : ]*>
Tässä sovitetaan yhteen avaava hakasulku, jota seuraa nolla tai useampi merkki lukuun ottamatta sulkevaa hakasulku [^>]* -merkkiä lähimpään sulkevaan hakasulkuun asti.
Laiska haku:
Kuvio :
Tässä tapauksessa täsmäämme kaiken ensimmäisestä avaavasta sulkeesta ensimmäiseen sulkeutuvaan sulkeeseen. Kysymysmerkki pakottaa .*:n täsmäämään mahdollisimman vähän merkkejä, kunnes se löytää sulkeutuvan sulkeen.
Valitsitpa minkä mallin tahansa, lopputulos on täysin sama.
Jos esimerkiksi haluat poistaa kaikki html-tunnisteet merkkijonosta A5 ja jättää tekstin, kaava on seuraava:
=RegExpReplace(A5, "]*>", "")
Tai voit käyttää laiskaa kvantifikaattoria, kuten kuvakaappauksessa näkyy:
Tämä ratkaisu toimii täydellisesti yksittäisen tekstin osalta (rivit 5 - 9). Usean tekstin osalta (rivit 10 - 12) tulokset ovat kyseenalaisia - eri tunnisteiden tekstit yhdistetään yhdeksi. Onko tämä oikein vai ei? Pelkäänpä, että tätä ei voi helposti päättää - kaikki riippuu siitä, miten ymmärrät halutun lopputuloksen. Esimerkiksi kohdassa B11 odotetaan tulosta "A1", kun taas kohdassa B10 saatetaan haluta, että'data1' ja 'data2' erotetaan toisistaan välilyönnillä.
Jos haluat poistaa html-tunnisteet ja erottaa jäljelle jäävät tekstit välilyönneillä, voit toimia näin:
- Korvaa tunnisteet välilyönneillä " ", ei tyhjillä merkkijonoilla:
=RegExpReplace(A5, "]*>", " ")
- Vähennä useat välilyönnit yhdeksi välilyönniksi:
=RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "), " ")
- Leikkaa etu- ja jälkimmäiset välilyönnit:
=TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")))
Tulos näyttää jotakuinkin tältä:
Ablebits Regex Remove Tool
Jos sinulla on ollut tilaisuus käyttää Ultimate Suite for Excel -pakettiamme, olet luultavasti jo havainnut uudet Regex-työkalut, jotka esiteltiin viimeisimmässä julkaisussa. Näiden .NET-pohjaisten Regex-toimintojen kauneus on se, että ne ensinnäkin tukevat täydellistä säännöllisten lausekkeiden syntaksia, joka ei sisällä VBA:n RegExp-rajoitteita, ja toiseksi ne eivät vaadi VBA-koodin lisäämistä työkirjoihisi, koska kaikki koodin integrointi tehdään.meidän toimesta backendissä.
Sinun tehtäväsi on rakentaa säännöllinen lauseke ja antaa se funktiolle :) Näytän, miten se tehdään käytännön esimerkin avulla.
Kuinka poistaa suluissa ja suluissa oleva teksti regexin avulla?
Pitkissä tekstijonoissa vähemmän tärkeät tiedot ovat usein [suluissa] ja (suluissa). Miten nämä merkityksettömät tiedot poistetaan, kun kaikki muu tieto säilyy?
Itse asiassa olemme jo rakentaneet samanlaisen regexin html-tunnisteiden poistamiseen, eli tekstin poistamiseen hakasulkeiden sisältä. Ilmeisesti samat menetelmät toimivat myös neliö- ja pyöreille hakasulkeille.
Kuvio : (\(.*?\))
Temppu on käyttää laiskaa kvantifikaattoria (*?) lyhimmän mahdollisen merkkijonon löytämiseksi. Ensimmäinen ryhmä (\(.*?\)) vastaa kaikkea avaavasta sulkeesta ensimmäiseen sulkeutuvaan sulkeeseen. Toinen ryhmä (\[.*?\]) vastaa kaikkea avaavasta sulkeesta ensimmäiseen sulkeutuvaan sulkeeseen. Pystypalkki
Kun kuvio on määritetty, "syötetään" se Regex Remove -funktioon. Näin:
- On Ablebits Data välilehdellä, kohdassa Teksti ryhmää, klikkaa Regex-työkalut .
Jos haluat saada tulokset kaavoina, ei arvoina, valitse valintaruutu Lisää kaavana valintaruutu.
Jos haluat poistaa suluissa olevan tekstin merkkijonoista A2:A5, asetukset määritetään seuraavasti:
Tämän seurauksena AblebitsRegexRemove toiminto lisätään uuteen sarakkeeseen alkuperäisten tietojen viereen.
Funktio voidaan syöttää myös suoraan soluun vakiomuotoisen Lisää toiminto valintaikkunassa, jossa se on luokiteltu kohtaan AblebitsUDFs .
Kuten AblebitsRegexRemove on suunniteltu poistamaan tekstiä, ja se tarvitsee vain kaksi argumenttia - lähdejonon ja regexin. Molemmat parametrit voidaan määritellä suoraan kaavassa tai ne voidaan antaa soluviittauksina. Tarvittaessa tätä mukautettua funktiota voidaan käyttää yhdessä minkä tahansa natiivin funktion kanssa.
Voit esimerkiksi leikata ylimääräiset välilyönnit tuloksena syntyvistä merkkijonoista käyttämällä TRIM-funktiota kääreenä:
=TRIM(AblebitsRegexRemove(A5, $A$2))
Näin poistat merkkijonoja Excelissä käyttämällä säännöllisiä lausekkeita. Kiitän sinua lukemisesta ja odotan innolla, että tapaamme blogissamme ensi viikolla!
Saatavilla olevat lataukset
Merkkijonojen poistaminen regexin avulla - esimerkkejä (.xlsm-tiedosto)
Ultimate Suite - kokeiluversio (.exe-tiedosto)