Regex för att ta bort vissa tecken eller text i Excel

  • Dela Detta
Michael Brown

Har du någonsin tänkt på hur kraftfullt Excel skulle vara om någon kunde berika dess verktygslåda med reguljära uttryck? Vi har inte bara tänkt utan arbetat på det :) Och nu kan du lägga till den här underbara RegEx-funktionen till dina egna arbetsböcker och radera ut delsträngar som matchar ett mönster på nolltid!

Förra veckan tittade vi på hur man använder reguljära uttryck för att ersätta strängar i Excel. För detta skapade vi en egen Regex Replace-funktion. Det visade sig att funktionen går bortom sitt primära användningsområde och kan inte bara ersätta strängar utan också ta bort dem. Hur kan det vara? I Excel är det inget annat än att ersätta ett värde med en tom sträng, något som vår Regex-funktion är.mycket bra på!

    VBA RegExp-funktion för att ta bort delsträngar i Excel

    Som vi alla vet stöds reguljära uttryck inte som standard i Excel. För att aktivera dem måste du skapa en egen användardefinierad funktion. Den goda nyheten är att en sådan funktion redan är skriven, testad och redo att användas. Allt du behöver göra är att kopiera den här koden, klistra in den i din VBA-editor och sedan spara filen som en arbetsbok med makroaktiverad arbetsbok (.xlsm).

    Funktionen har följande syntax:

    RegExpReplace(text, mönster, ersättning, [instance_num], [match_case])

    De tre första argumenten är obligatoriska, de två sista är valfria.

    Var:

    • Text - den textsträng som ska sökas i.
    • Mönster - det reguljära uttrycket att söka efter.
    • Ersättning - den text som ska ersättas med. Till ta bort delsträngar som matchar mönstret, använd en tom sträng ("") för utbyte.
    • Instance_num (valfritt) - den instans som ska ersättas. Om den inte anges ersätts alla hittade träffar (standard).
    • Match_case (valfritt) - ett boolskt värde som anger om man ska matcha eller ignorera skiftläget i texten. För skiftlägeskänslig matchning används TRUE (standard), för skiftlägesokänslig matchning - FALSE.

    Mer information finns i funktionen RegExpReplace.

    Tips: I enkla fall kan du ta bort specifika tecken eller ord från celler med Excel-formler, men reguljära uttryck ger dig mycket fler alternativ för detta.

    Hur man tar bort strängar med hjälp av reguljära uttryck - exempel

    Som nämnts ovan ska du ersätta delar av text som matchar ett mönster med en tom sträng för att ta bort dem. En generisk formel har alltså följande form:

    RegExpReplace(text, pattern, "", [instance_num], [match_case])

    Nedanstående exempel visar olika tillämpningar av detta grundkoncept.

    Ta bort alla matchningar eller en specifik matchning

    Funktionen RegExpReplace är utformad för att hitta alla understrängar som matchar en given regex. Vilka förekomster som ska tas bort styrs av det fjärde valfria argumentet, som heter instance_num .

    Standardinställningen är "alla träffar" - när instance_num Om argumentet utelämnas tas alla funna matchningar bort. Om du vill ta bort en specifik matchning anger du instansnumret.

    I strängarna nedan antar vi att du vill ta bort det första ordernumret. Alla sådana nummer börjar med hashtecknet (#) och innehåller exakt 5 siffror. Vi kan alltså identifiera dem med hjälp av det här regexet:

    Mönster : #\d{5}\b

    Ordgränsen \b anger att en matchande delsträng inte kan vara en del av en större sträng, t.ex. #10000001.

    Om du vill ta bort alla träffar använder du instance_num argumentet är inte definierat:

    =RegExpReplace(A5, "#\d{5}\b", "")

    För att bara utplåna den första förekomsten ställer vi in instance_num argumentet till 1:

    =RegExpReplace(A5, "#\d{5}\b", "", 1)

    Regex för att ta bort vissa tecken

    Om du vill ta bort vissa tecken från en sträng är det bara att skriva ner alla oönskade tecken och separera dem med ett vertikalt streck.

    För att standardisera telefonnummer som skrivs i olika format måste vi till exempel först göra oss av med vissa tecken som parenteser, bindestreck, punkter och mellanslag.

    Mönster : \(

    =RegExpReplace(A5, "\((

    Resultatet av denna operation är ett 10-siffrigt nummer som "1234567890".

    För att underlätta kan du skriva in regexet i en separat cell och hänvisa till den cellen med en absolut referens, t.ex. $A$2:

    =RegExpReplace(A5, $A$2, "")

    Sedan kan du standardisera formateringen på det sätt du vill genom att använda sammanlänkningsoperatorn (&) och textfunktioner som RIGHT (höger), MID (mitten) och LEFT (vänster).

    Om du till exempel vill skriva alla telefonnummer i formatet (123) 456-7890 är formeln följande:

    =""("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)

    Där B5 är resultatet av funktionen RegExpReplace.

    Ta bort specialtecken med hjälp av regex

    I en av våra handledningar tittade vi på hur du tar bort oönskade tecken i Excel med hjälp av inbyggda och anpassade funktioner. Regelbundna uttryck gör det mycket enklare! Istället för att lista alla tecken som ska tas bort kan du bara ange vilka du vill behålla :)

    Mönstret bygger på följande negerade teckenklasser - en caret placeras i en teckenklass [^ ] för att matcha alla enskilda tecken som INTE är inom parenteser. Kvantifieringen + tvingar den att betrakta på varandra följande tecken som en enda matchning, så att ersättningen görs för en matchande delsträng snarare än för varje enskilt tecken.

    Beroende på dina behov kan du välja en av följande regexer.

    För att ta bort Icke-alfanumerisk tecken, dvs. alla tecken utom bokstäver och siffror:

    Mönster : [^0-9a-zA-Z]+

    Rensa alla tecken utom bokstäver , siffror och utrymmen :

    Mönster : [^0-9a-zA-Z ]+

    Ta bort alla tecken utom bokstäver , siffror och Understrykning Du kan använda \W som står för ett tecken som INTE är ett alfanumeriskt tecken eller ett understrykningsstreck:

    Mönster : \W+

    Om du vill behålla några andra karaktärer t.ex. skiljetecken, sätt dem inom parentesen.

    Om du till exempel vill ta bort alla tecken som inte är bokstäver, siffror, punkter, kommatecken eller mellanslag använder du följande regex:

    Mönster : [^0-9a-zA-Z\., ]+

    Detta eliminerar alla specialtecken, men extra vitrymder kvarstår.

    För att åtgärda detta kan du bädda in ovanstående funktion i en annan funktion som ersätter flera mellanslag med ett enda mellanslagstecken.

    =RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " " ")

    Du kan också använda den ursprungliga TRIM-funktionen med samma effekt:

    =TRIM(RegExpReplace(A5, $A$2, ""))

    Regex för att ta bort icke-numeriska tecken

    Om du vill ta bort alla icke-numeriska tecken från en sträng kan du använda antingen den här långa formeln eller en av de mycket enkla regexer som anges nedan.

    Matcha alla tecken som INTE är en siffra:

    Mönster : \D+

    Rensa icke-numeriska tecken med hjälp av negerade klasser:

    Mönster : [^0-9]+

    Mönster : [^\d]+

    Tips: Om ditt mål är att ta bort text och sprida de återstående siffrorna till separata celler eller placera dem alla i en cell separerade med en angiven avgränsare, använd då funktionen RegExpExtract som förklaras i Så här extraherar du siffror från strängar med hjälp av reguljära uttryck.

    Regex för att ta bort allt efter mellanslag

    Om du vill utplåna allt efter ett mellanslag använder du antingen mellanslag ( ) eller vitrymdstecken (\s) för att hitta det första mellanslaget och .* för att matcha alla tecken efter det.

    Om du har strängar med en enda rad som bara innehåller normala mellanslag (värde 32 i 7-bitars ASCII-systemet) spelar det ingen roll vilken av nedanstående regexer du använder. Om du har strängar med flera rader gör det en skillnad.

    För att ta bort allt efter ett mellanslag , använd det här regexet:

    Mönster : " .*"

    =RegExpReplace(A5, " .*", "")

    Denna formel tar bort allt efter det första mellanslaget i varje rad För att resultaten ska visas korrekt måste du slå på Wrap Text (omslagstext).

    Att ta bort allt efter ett vitrymdsutrymme (inklusive mellanslag, tabb, vagnretur och ny rad), är regexet:

    Mönster : \s.*

    =RegExpReplace(A5, "\s.*", "")

    Eftersom \s matchar några olika typer av vitrymder, inklusive en ny rad (\n) raderar den här formeln allt efter det första mellanslaget i en cell, oavsett hur många rader som finns i cellen.

    Regex för att ta bort text efter ett visst tecken

    Med hjälp av metoderna från föregående exempel kan du radera text efter vilket tecken som helst som du anger.

    För att hantera varje rad separat:

    Generiskt mönster : char.*

    I strängar med en enda rad tar detta bort allt efter char I strängar med flera rader behandlas varje rad individuellt eftersom punkt (.) i VBA Regex-funktionen matchar alla tecken utom en ny rad.

    Behandla alla rader som en enda sträng:

    Generiskt mönster : char(.

    För att radera allt efter ett visst tecken, inklusive nya rader, läggs \n till i mönstret.

    Om du till exempel vill ta bort text efter det första kommatecknet i en sträng kan du prova dessa reguljära uttryck:

    Mönster : ,.*

    Mönster : ,(.

    I skärmbilden nedan kan du se hur resultaten skiljer sig åt.

    Regex för att ta bort allt före mellanslag

    När du arbetar med långa textsträngar kan du ibland vilja göra dem kortare genom att ta bort samma del av informationen i alla celler. Nedan diskuterar vi två sådana fall.

    Ta bort allt före det sista mellanslaget

    Precis som i det föregående exemplet beror ett reguljärt uttryck på hur du förstår vad ett "mellanslag" är.

    För att matcha något upp till sista utrymmet , räcker det här regexet (citationstecken har lagts till för att ett mellanslag efter en asterisk ska märkas).

    Mönster : ".* "

    För att matcha allt före sista blanksteg (inklusive mellanslag, tabb, vagnretur och ny rad), använd det här reguljära uttrycket.

    Mönster : .*\s

    Skillnaden är särskilt märkbar på strängar med flera rader.

    Ta bort allt före det första mellanslaget

    För att matcha allt upp till det första mellanslaget i en sträng kan du använda det här reguljära uttrycket:

    Mönster : ^[^ ]* +

    Från början av strängen ^ matchar vi noll eller fler tecken utan mellanslag [^ ]* som omedelbart följs av ett eller flera mellanslag " +". Den sista delen läggs till för att förhindra eventuella inledande mellanslag i resultatet.

    För att ta bort text före det första mellanslaget på varje rad skrivs formeln i standardläget "alla träffar" ( instance_num utelämnat):

    =RegExpReplace(A5, "^[^ ]* +", "")

    Om du vill ta bort text före det första mellanslaget på den första raden och lämna alla andra rader intakta, kan du använda instance_num är satt till 1:

    =RegExpReplace(A5, "^[^ ]* +", "", 1)

    Regex för att ta bort allt före ett tecken

    Det enklaste sättet att ta bort all text före ett visst tecken är att använda en regex som denna:

    Generiskt mönster : ^[^char]*char

    Översatt till ett mänskligt språk står det: "från början av en sträng som är förankrad med ^, matcha 0 eller fler tecken utom char [^char]* upp till den första förekomsten av char .

    Om du till exempel vill radera all text före det första kolonet använder du det här reguljära uttrycket:

    Mönster : ^[^:]*:

    För att undvika inledande mellanslag i resultatet kan du lägga till ett vitrymdssteg \s* i slutet. Detta tar bort allt före det första kolonet och skär bort eventuella mellanslag direkt efter det:

    Mönster : ^[^:]*:\s*

    =RegExpReplace(A5, "^[^:]*:\s*", "")

    Tips: Förutom reguljära uttryck har Excel egna sätt att ta bort text efter position eller matchning. Om du vill veta hur du utför uppgiften med egna formler, se Hur du tar bort text före eller efter ett tecken i Excel.

    Regex för att ta bort allt utom

    Om du vill ta bort alla tecken från en sträng utom de du vill behålla använder du negerade teckenklasser.

    Om du till exempel vill ta bort alla tecken utom små bokstäver och punkter är regexet:

    Mönster : [^a-z\.]+

    I själva verket skulle vi kunna klara oss utan kvantifieringen + här eftersom vår funktion ersätter alla hittade träffar. Kvantifieringen gör det bara lite snabbare - i stället för att hantera varje enskilt tecken ersätter du en delsträng.

    =RegExpReplace(A5, "[^a-z\.]+", "")

    Regex för att ta bort html-taggar i Excel

    För det första bör det noteras att HTML inte är ett reguljärt språk, så att analysera det med hjälp av reguljära uttryck är inte det bästa sättet. Med detta sagt kan regexer definitivt hjälpa till att ta bort taggar från cellerna för att göra datasetet renare.

    Eftersom html-taggar alltid placeras inom hakparenteser kan du hitta dem med hjälp av en av följande regexer.

    Negerad klass:

    Mönster : ]*>

    Här matchar vi en inledande hakparentes, följt av noll eller fler förekomster av alla tecken utom den avslutande hakparentesen [^>]* upp till närmaste avslutande hakparentes.

    Lättsam sökning:

    Mönster :

    Här matchar vi allt från den första öppnande parentesen till den första avslutande parentesen. Frågetecknet tvingar .* att matcha så få tecken som möjligt tills den hittar en avslutande parentes.

    Vilket mönster du än väljer blir resultatet helt likadant.

    Om du till exempel vill ta bort alla html-taggar från en sträng i A5 och lämna kvar text är formeln:

    =RegExpReplace(A5, "]*>", "")

    Eller så kan du använda den lata kvantifieraren som visas i skärmbilden:

    Den här lösningen fungerar perfekt för enstaka text (raderna 5-9). För flera texter (raderna 10-12) är resultatet tveksamt - texter från olika taggar slås ihop till en. Är detta korrekt eller inte? Det är tyvärr inte något som är lätt att avgöra - allt beror på hur du förstår det önskade resultatet. I B11 förväntas till exempel resultatet "A1", medan du i B10 kanske vill ha"data1" och "data2" ska skiljas åt med ett mellanslag.

    Om du vill ta bort html-taggar och separera de återstående texterna med mellanslag kan du göra så här:

    1. Ersätt taggar med mellanslag " ", inte tomma strängar:

      =RegExpReplace(A5, "]*>", " " ")

    2. Minska flera mellanslag till ett enda mellanslagstecken:

      =RegExpReplace(RegExpReplace(A5, "]*>", " " "), " +", " " ")

    3. Trimma ledande och avslutande blanksteg:

      =TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " " "), " +", " " "))

    Resultatet kommer att se ut ungefär så här:

    Ablebits Regex Remove Tool

    Om du har haft en chans att använda vår Ultimate Suite för Excel har du förmodligen redan upptäckt de nya Regex-verktygen som introducerades med den senaste versionen. Det fina med dessa .NET-baserade Regex-funktioner är att de för det första stöder fullfjädrad syntax för reguljära uttryck utan VBA RegExp-begränsningar och för det andra inte kräver att du infogar någon VBA-kod i dina arbetsböcker eftersom all kodintegration sker.av oss på baksidan.

    Din del av arbetet är att konstruera ett reguljärt uttryck och skicka det till funktionen :) Låt mig visa dig hur du gör det med ett praktiskt exempel.

    Hur du tar bort text inom parenteser och hakar med hjälp av regex

    I långa textsträngar finns mindre viktig information ofta inom [parenteser] och [parenteser]. Hur tar man bort dessa irrelevanta uppgifter och behåller alla andra uppgifter?

    Vi har faktiskt redan byggt en liknande regex för att radera html-taggar, dvs. text inom hakparenteser. Samma metoder fungerar givetvis även för fyrkantiga och runda parenteser.

    Mönster : (\(.*?\))

    Tricket är att använda en lat kvantifierare (*?) för att matcha den kortast möjliga delsträngen. Den första gruppen (\(.*?\)) matchar allt från en öppnande parentes till den första stängande parentesen. Den andra gruppen (\[.*?\]) matchar allt från en öppnande parentes till den första stängande parentesen. Ett vertikalt streck

    När mönstret är fastställt kan vi "mata" det till vår funktion Regex Remove. Så här gör vi:

    1. På den Uppgifter om Ablebits på fliken Text grupp, klicka på Regex-verktyg .

  • På den Regex-verktyg rutan, välj dina källsträngar, skriv in din regex, välj Ta bort och tryck på Ta bort .

    Om du vill få resultaten som formler, inte som värden, väljer du Infoga som en formel kryssrutan.

    För att ta bort text inom parenteser från strängar i A2:A5 konfigurerar vi inställningarna på följande sätt:

  • Som ett resultat av detta har AblebitsRegexRemove funktionen infogas i en ny kolumn bredvid de ursprungliga uppgifterna.

    Funktionen kan också anges direkt i en cell med hjälp av standardfunktionen Infoga funktion dialogrutan, där den kategoriseras under AblebitsUDFs .

    Som AblebitsRegexRemove är utformad för att ta bort text och kräver endast två argument - källsträngen och regex. Båda parametrarna kan definieras direkt i en formel eller tillhandahållas i form av cellreferenser. Om det behövs kan den här anpassade funktionen användas tillsammans med andra ursprungliga funktioner.

    Om du till exempel vill trimma bort extra mellanslag i de resulterande strängarna kan du använda TRIM-funktionen som en omslagsfunktion:

    =TRIM(AblebitsRegexRemove(A5, $A$2))

    Så här tar du bort strängar i Excel med hjälp av reguljära uttryck. Tack för att du läste och jag ser fram emot att se dig på vår blogg nästa vecka!

    Tillgängliga nedladdningar

    Ta bort strängar med hjälp av regex - exempel (.xlsm-fil)

    Ultimate Suite - testversion (.exe-fil)

    Michael Brown är en hängiven teknikentusiast med en passion för att förenkla komplexa processer med hjälp av mjukvaruverktyg. Med mer än ett decenniums erfarenhet inom teknikbranschen har han finslipat sina kunskaper i Microsoft Excel och Outlook, samt Google Sheets och Docs. Michaels blogg är tillägnad att dela med sig av sin kunskap och expertis med andra, och tillhandahåller lätta att följa tips och handledningar för att förbättra produktiviteten och effektiviteten. Oavsett om du är en erfaren proffs eller nybörjare, erbjuder Michaels blogg värdefulla insikter och praktiska råd för att få ut det mesta av dessa viktiga programvaruverktyg.