Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Myrmica 23 Března 2015, 10:37:56

Název: Regurální výraz pro speciální hledání
Přispěvatel: Myrmica 23 Března 2015, 10:37:56
Ahoj,
často v textu hledám pomocí regulárních výrazů (používám Qt a QRegExp).

Úloha:
Mám řetězec např. "Window" potřebuji vyhledat všechny výskyty tohoto řetězce, kromě těch výskytů, které obsahují řetězec např. "BlueWindow".
Druhý řetězec vždy obsahuje hledaný řetězec a je známý při tvorbě reg. výrazu. Hledaný řetězec se může vyskytovat na začátku či na konci slova či řádku, může být i samostatné slovo.
Takže příklady:
"mWindowQ" nalezne
"mBlueWindowQ" nenalezne

Potřebuji to pro nahrazování či jiné zpracování textu ve zdrojových souborech. To pak probíhá v několika krocích. Čas od času se mi stane, že do dávky souborů pro nahrazení textu se mi dostane i soubor, který má text již nahrazený. Dosud jsem to prováděl na dva kroky (je to dost pracné):
1. krok - nový řetězec neobsahuje původní řetězec, nahrazení nalezeného řetězce novým.
2. krok - nahrazení nového řetězce na cílovým řetězcem.

Protože dnes nemám nějak inspiraci, budu vděčný za každou radu.

Zatím mám jedinou ideu provést to co provádím ručně softwarově.
1. sestavit náhodný řetězec, zjistit jestli náhodou není již obsažený v textu.
2. náhodným řetězcem nahradit všechny výskyty řetězce "BlueWindow"
3. provést vyhledání a zpracování řetězce "Window".
4. zpět nahradit náhodný řeťězec řetězcem "BlueWindow".
Pokud někoho z vás nenapadne inteligentní regulární výraz, budu to pak nucen takto provést.
Název: Re:Regurální výraz pro speciální hledání
Přispěvatel: donny 23 Března 2015, 18:41:34
Tomu, co potrebujes, se v regularnich vyrazech rika Negative Lookbehind (?<! ... ). Napr.:

/(\w(?<!Blue)Window\w)/g

Zkusit si to muzes napr. na https://regex101.com/#pcre
Název: Re:Regurální výraz pro speciální hledání
Přispěvatel: Myrmica 24 Března 2015, 09:26:25
Díky za odpověď,
Negative Lookbehind je po mě důležitá informace,  kterou jsem dosud neznal. Musím to pořádně prostudovat.
Zatím jsem pro rychlost řešení byl nucen použít mnou navrhované řešení.
Ale po prostudování předpokládám použití regulárního výrazu na základě Look-around.