Indholdsfortegnelse
Har du nogensinde tænkt på, hvor kraftfuld Excel ville være, hvis nogen kunne berige dets værktøjskasse med regulære udtryk? Vi har ikke kun tænkt, men også arbejdet på det :) Og nu kan du tilføje denne vidunderlige RegEx-funktion til dine egne regneark og slette understrenge, der matcher et mønster på ingen tid!
I sidste uge kiggede vi på, hvordan man bruger regulære udtryk til at erstatte strenge i Excel. Til dette formål oprettede vi en brugerdefineret Regex Replace-funktion. Det viste sig, at funktionen går ud over sin primære anvendelse og ikke kun kan erstatte strenge, men også fjerne dem. Hvordan kan det være? I Excel er det at fjerne en værdi ikke andet end at erstatte den med en tom streng, hvilket vores Regex-funktion ermeget god til!
VBA RegExp-funktion til at fjerne delstrenge i Excel
Som vi alle ved, understøttes regulære udtryk ikke som standard i Excel. For at aktivere dem skal du oprette din egen brugerdefinerede funktion. Den gode nyhed er, at en sådan funktion allerede er skrevet, testet og klar til brug. Alt du skal gøre er at kopiere denne kode, indsætte den i din VBA-editor og derefter gemme din fil som en makroaktiveret arbejdsbog (.xlsm).
Funktionen har følgende syntaks:
RegExpReplace(text, pattern, replacement, [instance_num], [match_case])De tre første argumenter er obligatoriske, de to sidste er valgfrie.
Hvor:
- Tekst - den tekststreng, der skal søges i.
- Mønster - det regulære udtryk, der skal søges efter.
- Udskiftning - den tekst, der skal erstattes med. Til fjerne delstrenge der matcher mønsteret, skal du bruge en tom streng ("") til udskiftning.
- Instance_num (valgfrit) - den instans, der skal erstattes. Hvis den udelades, erstattes alle fundne match (standard).
- Match_case (valgfrit) - en boolsk værdi, der angiver, om der skal matches eller ignoreres mellem store og små bogstaver i teksten. Ved case-sensitiv matchning anvendes TRUE (standard); ved case-insensitiv - FALSE.
Du kan finde flere oplysninger under RegExpReplace-funktionen.
Tip. I enkle tilfælde kan du fjerne specifikke tegn eller ord fra celler med Excel-formler. Men regulære udtryk giver dig langt flere muligheder for dette.
Sådan fjerner du strenge ved hjælp af regulære udtryk - eksempler
Som nævnt ovenfor skal dele af tekst, der matcher et mønster, erstattes med en tom streng for at fjerne dem. En generisk formel har således denne form:
RegExpReplace(text, pattern, "", [instance_num], [match_case])Nedenstående eksempler viser forskellige implementeringer af dette grundlæggende koncept.
Fjern alle kampe eller en specifik kamp
RegExpReplace-funktionen er designet til at finde alle understrenge, der matcher en given regex. Hvilke forekomster der skal fjernes, styres af det fjerde valgfrie argument, der hedder instance_num .
Standardindstillingen er "alle kampe" - når instance_num udelades, fjernes alle de fundne match. Hvis du vil slette en specifik match, skal du angive instansnummeret.
Antag, at du vil slette det første ordrenummer i nedenstående strenge. Alle sådanne numre begynder med hash-tegnet (#) og indeholder præcis 5 cifre. Vi kan derfor identificere dem ved hjælp af dette regex:
Mønster : #\d{5}\b
Ordgrænsen \b angiver, at en matchende delstreng ikke kan være en del af en større streng som f.eks. #10000001.
Hvis du vil fjerne alle match, skal du bruge instance_num argumentet er ikke defineret:
=RegExpReplace(A5, "#\d{5}\b", "")
For kun at udrydde den første forekomst indstiller vi instance_num argument til 1:
=RegExpReplace(A5, "#\d{5}\b", "", 1)
Regex til at fjerne visse tegn
Hvis du vil fjerne visse tegn fra en streng, skal du blot skrive alle uønskede tegn ned og adskille dem med en lodret streg
For at standardisere telefonnumre, der er skrevet i forskellige formater, skal vi f.eks. først fjerne specifikke tegn som parenteser, bindestreger, prikker og mellemrum.
Mønster : \(
=RegExpReplace(A5, "\((
Resultatet af denne operation er et 10-cifret tal som f.eks. "1234567890".
For at gøre det nemmere kan du indtaste regex'et i en separat celle og henvise til denne celle ved hjælp af en absolut reference, f.eks. $A$2:
=RegExpReplace(A5, $A$2, "")
Derefter kan du standardisere formateringen som du ønsker ved at bruge sammenkædningsoperatoren (&) og tekstfunktioner som RIGHT, MID og LEFT.
Hvis du f.eks. vil skrive alle telefonnumre i formatet (123) 456-7890, er formlen:
="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)
Hvor B5 er resultatet af funktionen RegExpReplace.
Fjern specialtegn ved hjælp af regex
I en af vores tutorials så vi på, hvordan du fjerner uønskede tegn i Excel ved hjælp af indbyggede og brugerdefinerede funktioner. Regelmæssige udtryk gør tingene meget nemmere! I stedet for at liste alle de tegn, der skal slettes, skal du blot angive dem, du vil beholde :)
Mønstret er baseret på negerede tegnklasser - et karet sættes inden for en tegnklasse [^ ] for at matche ethvert enkelt tegn, der IKKE er i parenteser. Kvantifikatoren + tvinger den til at betragte på hinanden følgende tegn som et enkelt match, så en udskiftning foretages for en matchende delstreng i stedet for for hvert enkelt tegn.
Afhængigt af dine behov kan du vælge en af følgende regexer.
For at fjerne ikke-alfanumerisk tegn, dvs. alle tegn undtagen bogstaver og cifre:
Mønster : [^0-9a-zA-Z]+
Sådan renses alle tegn undtagen bogstaver , cifre og rum :
Mønster : [^0-9a-zA-Z ]+
Sådan slettes alle tegn undtagen bogstaver , cifre og understregning , kan du bruge \WW, der står for ethvert tegn, som IKKE er et alfanumerisk tegn eller en understregning:
Mønster : \W+
Hvis du ønsker at beholde nogle andre karakterer , f.eks. tegnsætningstegn, skal du sætte dem inden for parentesen.
Hvis du f.eks. vil fjerne alle andre tegn end et bogstav, et ciffer, et punktum, et komma eller et mellemrum, skal du bruge følgende regex:
Mønster : [^0-9a-zA-Z\., ]+
Det lykkes at fjerne alle specialtegn, men der er stadig ekstra mellemrum tilbage.
For at løse dette problem kan du integrere ovenstående funktion i en anden funktion, som erstatter flere mellemrum med et enkelt mellemrum.
=RegExpReplace(RegExpReplace(A5,$A$2,"""), " +", " " ")
Du kan også bare bruge den oprindelige TRIM-funktion med samme effekt:
=TRIM(RegExpReplace(A5, $A$2, ""))
Regex til at fjerne ikke-numeriske tegn
Hvis du vil slette alle ikke-numeriske tegn fra en streng, kan du bruge enten denne lange formel eller en af de meget enkle regexer, der er anført nedenfor.
Match ethvert tegn, der IKKE er et ciffer:
Mønster : \D+
Fjern ikke-numeriske tegn ved hjælp af negerede klasser:
Mønster : [^0-9]+
Mønster : [^\d]+
Tip. Hvis dit mål er at fjerne tekst og spilde de resterende tal i separate celler eller placere dem alle i én celle adskilt med en specificeret afgrænser, skal du bruge funktionen RegExpExtract som forklaret i Sådan udtrækkes tal fra en streng ved hjælp af regulære udtryk.
Regex til at fjerne alt efter et mellemrum
Hvis du vil slette alt efter et mellemrum, skal du bruge enten mellemrum ( ) eller whitespace-tegnet (\s) til at finde det første mellemrum og .* til at matche alle tegn efter det.
Hvis du har enstrengede strenge med en enkelt linje, der kun indeholder normale mellemrum (værdi 32 i 7-bit ASCII-systemet), er det ligegyldigt, hvilken af nedenstående regexer du bruger. Hvis der er tale om strenge med flere linjer, gør det en forskel.
Sådan fjerner du alt efter et mellemrum , bruge denne regex:
Mønster : " .*"
=RegExpReplace(A5, " .*", "")
Denne formel fjerner alt efter det første mellemrum i hver linje For at resultaterne vises korrekt, skal du sørge for at slå Tekst ombrydning til.
At fjerne alt efter et mellemrum (inklusive mellemrum, tabulator, vognrum og ny linje), er regex'en:
Mønster : \s.*
=RegExpReplace(A5, "\s.*", "")
Fordi \s passer til et par forskellige typer mellemrum, herunder en ny linje (\n), sletter denne formel alt efter det første mellemrum i en celle, uanset hvor mange linjer der er i den.
Regex til at fjerne tekst efter et bestemt tegn
Ved hjælp af metoderne fra det foregående eksempel kan du slette tekst efter et vilkårligt tegn, som du angiver.
For at behandle hver linje separat:
Generisk mønster : char.*
I enstrengede strenge vil dette fjerne alt efter char I strenge med flere linjer vil hver linje blive behandlet individuelt, fordi et punktum (.) i VBA Regex-stilen passer til ethvert tegn undtagen en ny linje.
For at behandle alle linjer som en enkelt streng:
Generisk mønster : char(.
For at slette alt efter et givet tegn, herunder nye linjer, tilføjes \n til mønsteret.
Hvis du f.eks. vil fjerne tekst efter det første komma i en streng, kan du prøve disse regulære udtryk:
Mønster : ,.*
Mønster : ,(.
I skærmbilledet nedenfor kan du se, hvordan resultaterne er forskellige.
Regex til at fjerne alt før et mellemrum
Når du arbejder med lange tekststrenge, kan du nogle gange ønske at gøre dem kortere ved at fjerne den samme del af informationen i alle celler. Nedenfor vil vi diskutere to sådanne tilfælde.
Fjern alt før det sidste mellemrum
Som i det foregående eksempel afhænger et regulært udtryk af din forståelse af "mellemrum".
For at matche noget op til sidste plads er denne regex tilstrækkelig (anførselstegn er tilføjet for at gøre et mellemrum efter en stjerne synligt).
Mønster : ".* "
For at matche noget før sidste mellemrum (herunder mellemrum, tabulator, vogn tilbage og ny linje), skal du bruge dette regulære udtryk.
Mønster : .*\s
Forskellen er især mærkbar på strenge med flere linjer.
Fjern alt før det første mellemrum
Du kan bruge dette regulære udtryk til at matche alt op til det første mellemrum i en streng:
Mønster : ^[^ ]* +
Fra starten af en streng ^ matcher vi nul eller flere tegn uden mellemrum [^ ]*, der er umiddelbart efterfulgt af et eller flere mellemrum " +". Den sidste del er tilføjet for at forhindre potentielle ledende mellemrum i resultaterne.
For at fjerne tekst før det første mellemrum i hver linje skrives formlen i standardtilstanden "alle kampe" ( instance_num udeladt):
=RegExpReplace(A5, "^[^ ]* +", "")
Hvis du vil slette tekst før det første mellemrum i den første linje og lade alle andre linjer forblive intakte, skal du bruge instance_num argumentet er sat til 1:
=RegExpReplace(A5, "^[^ ]* +", "", "", 1)
Regex til at fjerne alt før et tegn
Den nemmeste måde at fjerne al tekst før et bestemt tegn er ved at bruge en regex som denne:
Generisk mønster : ^[^char]*char
Oversat til et menneskeligt sprog står der: "fra starten af en streng forankret med ^, match 0 eller flere tegn undtagen char [^char]* op til den første forekomst af char .
Hvis du f.eks. vil slette al tekst før det første kolon, skal du bruge dette regulære udtryk:
Mønster : ^[^:]*:
For at undgå ledende mellemrum i resultaterne skal du tilføje et whitespace-tegn \s* til sidst. Dette fjerner alt før det første kolon og trimmer alle mellemrum lige efter det:
Mønster : ^[^:]*:\s*
=RegExpReplace(A5, "^[^:]*:\s*", "")
Tip. Ud over regulære udtryk har Excel sine egne midler til at fjerne tekst efter position eller match. Du kan lære at udføre opgaven med native formler ved at se Sådan fjerner du tekst før eller efter et tegn i Excel.
Regex til at fjerne alt undtagen
Hvis du vil fjerne alle tegn fra en streng undtagen dem, du ønsker at beholde, skal du bruge negerede tegnklasser.
For at fjerne alle tegn undtagen små bogstaver og prikker er regexet f.eks:
Mønster : [^a-z\.]+
Faktisk kunne vi godt undvære +-kvantifikatoren her, da vores funktion erstatter alle fundne match. Kvantifikatoren gør det bare lidt hurtigere - i stedet for at håndtere hvert enkelt tegn erstatter du en delstreng.
=RegExpReplace(A5, "[^a-z\.]+", "")
Regex til at fjerne html-tags i Excel
Først og fremmest skal det bemærkes, at HTML ikke er et regulært sprog, så det er ikke den bedste måde at analysere det ved hjælp af regulære udtryk. Når det er sagt, kan regexes helt sikkert hjælpe med at fjerne tags fra dine celler for at gøre dit datasæt renere.
Da html-tags altid er placeret inden for kantede parenteser , kan du finde dem ved hjælp af en af følgende regexer.
Negeret klasse:
Mønster : ]*>
Her matcher vi en indledende kantet parentes efterfulgt af nul eller flere forekomster af ethvert tegn undtagen den afsluttende kantede parentes [^>]* op til den nærmeste afsluttende kantede parentes.
Dovne søgning:
Mønster :
Her matcher vi alt fra den første åbne parentes til den første lukkende parentes. Spørgsmålstegnet tvinger .* til at matche så få tegn som muligt, indtil den finder en lukkende parentes.
Uanset hvilket mønster du vælger, vil resultatet være det samme.
Hvis du f.eks. vil fjerne alle html-tags fra en streng i A5 og lade teksten stå tilbage, er formlen:
=RegExpReplace(A5, "]*>", "")
Eller du kan bruge den dovne kvantifikator som vist på skærmbilledet:
Denne løsning fungerer perfekt for enkelt tekst (række 5 - 9). For flere tekster (række 10 - 12) er resultatet tvivlsomt - tekster fra forskellige tags bliver slået sammen til ét. Er det korrekt eller ej? Det er desværre ikke noget, der er let at afgøre - det afhænger af din forståelse af det ønskede resultat. For eksempel forventes resultatet "A1" i B11, mens du i B10 måske ønsker"data1" og "data2" skal adskilles med et mellemrum.
Hvis du vil fjerne html-tags og adskille de resterende tekster med mellemrum, kan du gøre det på denne måde:
- Udskift tags med mellemrum " ", ikke tomme strenge:
=RegExpReplace(A5, "]*>", " " ")
- Reducere flere mellemrum til et enkelt mellemrum:
=RegExpReplace(RegExpReplace(A5, "]*>", " " "), " +", " " ")
- Trimmer ledende og afsluttende mellemrum:
=TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " " "), " +", " " ")))
Resultatet vil se nogenlunde sådan her ud:
Ablebits Regex Remove Tool
Hvis du har haft mulighed for at bruge vores Ultimate Suite til Excel, har du sikkert allerede opdaget de nye Regex-værktøjer, der blev introduceret med den seneste version. Det smukke ved disse .NET-baserede Regex-funktioner er, at de for det første understøtter fuld funktionalitet i syntaksen for regulære udtryk uden VBA RegExp-begrænsninger, og for det andet kræver de ikke, at du indsætter VBA-kode i dine regneark, da al kodeintegration skeraf os i backend.
Din del af opgaven er at konstruere et regulært udtryk og sende det til funktionen :) Lad mig vise dig, hvordan du gør det med et praktisk eksempel.
Sådan fjerner du tekst i parenteser og parenteser ved hjælp af regex
I lange tekststrenge er mindre vigtige oplysninger ofte omsluttet af [parenteser] og (parenteser). Hvordan fjerner du disse irrelevante detaljer, så du beholder alle andre data?
Faktisk har vi allerede bygget en lignende regex til at slette html-tags, dvs. tekst inden for kantede parenteser. Naturligvis vil de samme metoder også fungere for firkantede og runde parenteser.
Mønster : (\(.*?\))
Tricket er at bruge en doven kvantifikator (*?) til at matche den kortest mulige delstreng. Den første gruppe (\(.*?\)) matcher alt fra en indledende parentes til den første lukkende parentes. Den anden gruppe (\[.*?\]) matcher alt fra en indledende parentes til den første lukkende parentes. En lodret streg
Når mønsteret er fastlagt, kan vi "fodre" det til vores Regex Remove-funktion. Sådan gør vi:
- På den Ablebits Data under fanen, i fanen Tekst gruppe, klik på Regex-værktøjer .
Hvis du vil have resultaterne som formler og ikke som værdier, skal du vælge Indsæt som en formel afkrydsningsfeltet.
For at fjerne tekst i parenteser fra strenge i A2:A5 konfigurerer vi indstillingerne som følger:
Som følge heraf har AblebitsRegexRemove funktionen indsættes i en ny kolonne ved siden af dine oprindelige data.
Funktionen kan også indtastes direkte i en celle via standardfunktionen Indsæt funktion dialogboksen, hvor den er kategoriseret under AblebitsUDF'er .
Som AblebitsRegexRemove er designet til at fjerne tekst og kræver kun to argumenter - kildestrengen og regex. Begge parametre kan defineres direkte i en formel eller leveres i form af cellereferencer. Hvis det er nødvendigt, kan denne brugerdefinerede funktion bruges sammen med andre oprindelige funktioner.
Hvis du f.eks. vil trimme ekstra mellemrum i de resulterende strenge, kan du bruge TRIM-funktionen som en wrapper:
=TRIM(AblebitsRegexRemove(A5, $A$2))
Sådan fjerner du strenge i Excel ved hjælp af regulære udtryk. Tak fordi du læste med, og jeg glæder mig til at se dig på vores blog i næste uge!
Tilgængelige downloads
Fjern strenge ved hjælp af regex - eksempler (.xlsm-fil)
Ultimate Suite - prøveversion (.exe-fil)