🐮 Jak pojmenovat proměnné v regulárních výrazech

Tenhle fígl mne naučil @ludekvolejnik - mistr regulárních výrazů :wink:
Děkuji Luďo.

O co jde

Dosud jsem ukazoval, že v Blending Bullovi dokážete z textu vyparsovat proměnné. Ty pak dovedete zapsat do výstupního souboru. Viz. příklad, kde jsem zpracovával data z XML souboru do CSV pro import do Mergada. Regulárním výrazem v políčku Nalézt v datovém zdroji text jsem získával dvě proměnné.

Regulární výraz byl:
<item id="(.*?)"><stock_quantity>(.*?)<\/stock_quantity>.*<\/item>

Dále jsem do políčka Nahradit za text vložil:
"\g<1>","\g<2>"

Proměnné jsem označoval jako \g<X> kde X bylo číslo pořadí.

Problém

Uvedený postup funguje spolehlivě, pokud jsou u všech items uvedeny obě proměnné. Narazil jsem ale na situaci, kdy to nebylo jisté. A @ludekvolejnik mi ukázal tento zápis:

Regulární výraz:
(?P<nazev>.*?)

Toto odpovídá zápisu (.*?) ale má jednu zajímavou vlastnost. Do výstupu ho zapíšete jako:
\g<nazev>

tedy si můžete jednotlivé proměnné pojmenovat!
Což se může hodit. Zejména pokud nemáte jistotu, že např. druhá proměnná ze tří v item bude přítomna. Její absence by vám mohla zpracování feedu rozbít.

Příklad jak by vypadal celý zápis viz výše

Regulární výraz:

<item id="(?P<ID>.*?)"><stock_quantity>(?P<QUANTITY>.*?)<\/stock_quantity>.*<\/item>

Nahradit za text:

"\g<ID>","\g<QUANTITY>"

Řešení

Suma sumárum mi pojmenování proměnných přijde lepší než pořadí. Zápis vypadá krkolomně. Já si do záložek v prohlížeči uložím tuto stránku. A když ho budu potřebovat, zápis zkopíruji z tohoto příkladu :wink:


PS: @ludekvolejnik dělá školení regulárních výrazů. Pokud vás jejich síla oslovila (třeba proto, že vám šetří práci) doporučuji.

2 Likes