Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Regurální výraz pro speciální hledání  (Přečteno 2061 krát)

Myrmica

  • Závislák
  • ***
  • Příspěvků: 1701
    • MYRMICA
Regurální výraz pro speciální hledání
« kdy: 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.
Stolní strojek: OS– UBUNTU 16.04 x86_64, MB ASUS P8 Z68-V/GEN3, Intel® Core™ i5-3470 CPU @ 3.20GHz × 4 , 16GiB DDR3, GeForce GTX 670...
Notebook: ASUS U53Jc OS– UBUNTU 16.04 x86_64, Windows 7, Processor – Intel Core i5-460M (2,53 GHz), Graphics – switchable NVIDIA GeForce 310M and Intel GMA HD

donny

  • Závislák
  • ***
  • Příspěvků: 1861
Re:Regurální výraz pro speciální hledání
« Odpověď #1 kdy: 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
archlinux @ i7-6700/GTX1080 8G/32G DDR4/.5TB NVMe/WD RED 3TB | Raspbian 8 @ Raspberry Pi
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better!

Myrmica

  • Závislák
  • ***
  • Příspěvků: 1701
    • MYRMICA
Re:Regurální výraz pro speciální hledání
« Odpověď #2 kdy: 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.
Stolní strojek: OS– UBUNTU 16.04 x86_64, MB ASUS P8 Z68-V/GEN3, Intel® Core™ i5-3470 CPU @ 3.20GHz × 4 , 16GiB DDR3, GeForce GTX 670...
Notebook: ASUS U53Jc OS– UBUNTU 16.04 x86_64, Windows 7, Processor – Intel Core i5-460M (2,53 GHz), Graphics – switchable NVIDIA GeForce 310M and Intel GMA HD

 

Provoz zaštiťuje spolek OpenAlt.