image/svg+xml

» Poradna » Ostatní

Regulární výraz - nahrazení mezer v části textu

 | Microsoft Windows 7 Chrome 79.0.3945.94

Zdravím,mám text, kde každý řádek vypadá následovně:Obecný text @## ##,# # #/# ### ## #####Kde "obecný text" je prostě text obsahující libovolné znaky včetně mezer a číslic# je číslice@## je kód, který se v obecném textu nevyskytujeChci nahradit všechny mezery za @## tabulátorem. Počet skupin číslic je různý desetiny a lomítka nemusí být všude.Chtěl jsem to udělat takto:Najít: (@\d+)( ([\d,/]+))+Nahradit: $1\t$3Jenže jsem očividně špatně pochopil referenci, protože $3 mi vrací poslední výskyt (Obecný text @## #####)Teď nevím jak dál. Ani mě nenapadá, co bych měl Googlit.Dokáže mě, prosím, někdo popostrčit správným směrem? Používám Notepad++Díky.

Mohlo by vás také zajímat

Odpovědi na otázku

 | Microsoft Windows 10 Chrome 79.0.3945.88

výraz: (@\d+)( +)náhrada: $1\tZ textu:Obecný text @12 12,3 1 1/1 123 12 12345 @123454 @1235 4565udělá:Obecný text @12\t12,3 1 1/1 123 12 12345 @123454\t@1235\t4565

Souhlasím  |  Nesouhlasím
 | Microsoft Windows 7 Chrome 79.0.3945.94

Díky za odpověď. Špatně jsem se vyjádřil. Chtěl bych to takto:Původní:Obecný text @## ##,# # #/# ### ## #####Nahrazený:Obecný text @##\t##,#\t#\t#/#\t###\t##\t#####

Souhlasím  |  Nesouhlasím
 |   |  Microsoft Windows XP Firefox 52.0

A není jednodušší obecný text nechat v Excelu podle mezer a lomítek nasekat do sloupců a uložit jako .txt. Položky tak rovnou zůstanou oddělené tabelátory.

Souhlasím  |  Nesouhlasím
 | Microsoft Windows 10 Chrome 79.0.3945.94

Dá se to řešit tak, že si to rozdělím na dva soubory. Jeden bude obsahovat část před @ a druhý za.V části za nahradím všechny mezery za tabulátory a potom zase spojím.Jenže to je "moc práce" a ten regex mi nedá spát.

Souhlasím  |  Nesouhlasím
 | Microsoft Windows 10 Chrome 79.0.3945.88

Aha, tak to jsem špatně pochopil. Tipnul bych si, že to pomocí regexu nepůjde, ale třeba se pletu.

Souhlasím  |  Nesouhlasím
 |   |  Microsoft Windows 10 Chrome 79.0.3945.88

Na testování regulárních výrazů používám tuto web stránku https://regexr.com/

Souhlasím  |  Nesouhlasím
avatar
 | Microsoft Windows 10 Firefox 68.0

To je zajimavy problem - nejak mne nenapada, jak to pres regularni vyraz udelat. Osobne bych na to napsal kratky skript, treba v Pythonu by to bylo cca na pet radek. Bylo by to pro tebe reseni?

Souhlasím  |  Nesouhlasím
 | Microsoft Windows 10 Chrome 79.0.3945.94

Díky za odpověď. Skriptem je to jednoduché - split() a potom replace(). Problém řešení má. Ale pořád přemýšlím, jestli by to nešlo jedním výrazem.

Souhlasím  |  Nesouhlasím
 | Microsoft Windows 10 Chrome 79.0.3945.88

V podstatě je to celkem jednoduché nahrazení "mezery" za "tabelátor", ale jen v textu, který je za zavináčem.Tohle by to chtělo řešit nějakým dvoukrokovým prográmkem který nejprve nalezne oblast čísel/mezer/lomítek/čárek, které jsou za zavináčem a na tuto oblast aplikuje jednoduché nahrazení mezery za tabelátor. Řešit to kompletně pomocí regulárních výrazů je "možné", ale v praxi problematicky proveditelné. Jde to pomocí regex:Najít: "(?<=@.*) " (bez uvozovek, já je tam dal aby bylo vidět tu mezeru na konci)Nahradit: \tTento regulární výraz využívá "positive lookbehind s variabilní délkou" a defakto dělá to co jsem popsal. Vyhledává mezery, pomocí lookbehind před mezerou hledá text, který začíná zavináčem a následuje libovolný počet libovolných znaků. Tj mezera před zavináčem (v obecném textu) to nesplňuje a nebude vybrána k nahrazení. Jediný problém tohoto je, že není moc regex enginů, které podporují lookbehind s variabilní délkou. Co vím tak to podporuje regex engine v .NET Frameworku a pak nejspíš Javascriptový engine (ale tam taky nevím zda to umí všechny prohlížeče). Co za regex engine používá Notepad++ netuším a nevím zda to tam bude fungovat.

Souhlasím  |  Nesouhlasím
 | Microsoft Windows 10 Chrome 79.0.3945.94

Díky za skvělou odpověď!Notepad++ to sice nepodporuje. Ale překvapila mě částečná podpora (Chromium a deriváty viz https://caniuse.com/ ) v Javascriptu.

Souhlasím  |  Nesouhlasím

Související témata: Regulární výraz, Výskyt