Portál AbcLinuxu, 10. května 2025 09:11

Dotaz: Reg. výraz na vyhľadanie určitých častí zo súboru

Marián Oravec avatar 4.10.2007 09:22 Marián Oravec | skóre: 22 | Nitra
Reg. výraz na vyhľadanie určitých častí zo súboru
Přečteno: 277×
Odpovědět | Admin
Ahoj.

Dosť často, kvôli uľahčeniu práce, potrebujem napísať regulárny výraz, ktorý by našiel určité časti textového, HTML, XML apod. súboru.

Uvažujme nasledujúci súbor (možno sa podobá na XML, ale zaujíma ma riešenie pomocou regulárneho výrazu):
 1. [ROOT]
 2.   [A]
 3.     nieco
 4.   [/A]
 5.   [A]
 6.     aaa
 7.   [/A]
 8.   [A]
 9.     nieco
10.   [/A]
11.   [B]
12.     [C]
13.       nieco
14.     [/C]
15.   [/B]
16.   [A]
17.     aaa
18.   [/A]
19.   [A]
20.     nieco
21.   [/A]
22. [/ROOT]
Chcem vyhľadať LEN tie časti/elementy "[A]..[/A]", ktoré v sebe (kdekoľvek, aj vo vnorenej časti/elemente) obsahujú text "aaa".

Skúšal som nasledovné: (?s)\[A\].*?aaa.*?\[\/A\] ale nefunguje správne. Prvý match je od 2. po 7. riadok a druhý match je od 8. po 18. riadok. Čiže match obsahuje aj časti, ktoré nechcem...

Čo vlastne potrebujem: Nájsť element [A], za ním (v ňom) hľadať text "aaa", ale hľadať ho iba dovtedy, kým nenarazím na koniec tohto elementu [/A].

PS: Uvažujme, že v elemente A nemôže byť vnorený ďalší element A (ale iné môžu).

Za radu vopred ďakujem.
Mám rád elektro, ale vypočujem si aj iné...
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.10.2007 09:30 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Reg. výraz na vyhľadanie určitých častí zo súboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Musíte zařídit, aby výplň okolo aaa nemohla obsahovat [A]. Zkusil bych
(?s)\[A\](?!\[A\])*?aaa(?!\[A\])*?\[\/A\]
Marián Oravec avatar 4.10.2007 09:39 Marián Oravec | skóre: 22 | Nitra
Rozbalit Rozbalit vše Re: Reg. výraz na vyhľadanie určitých častí zo súboru
Bohužiaľ toto nefunguje :-(
Mám rád elektro, ale vypočujem si aj iné...
4.10.2007 09:43 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Reg. výraz na vyhľadanie určitých častí zo súboru
Nefunguje znamená co? Používáte program, který tomu regulárnímu výrazu nerozumí, najde to něco jiného, nenajde to nic?
Marián Oravec avatar 4.10.2007 09:51 Marián Oravec | skóre: 22 | Nitra
Rozbalit Rozbalit vše Re: Reg. výraz na vyhľadanie určitých častí zo súboru
Nenájde to nič. Skúšal som viac modifikácií, napr. (?s)\[A\](?!\[A\]).*?aaa(?!\[A\]).*?\[\/A\] (bodky pred *), ale bez úspechu.
Mám rád elektro, ale vypočujem si aj iné...
4.10.2007 10:29 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Reg. výraz na vyhľadanie určitých častí zo súboru
V tom případě zkuste toto (v eclipse to funguje):
(?s)\[A\]([^\[]|\[(?!A))*?aaa.*?\[/A\]
Marián Oravec avatar 4.10.2007 10:45 Marián Oravec | skóre: 22 | Nitra
Rozbalit Rozbalit vše Re: Reg. výraz na vyhľadanie určitých častí zo súboru
Ďakujem, tento regulárny výraz funguje správne. Je to presne to čo som potreboval. Ešte raz ďakujem a otázku označujem za vyriešenú.
Mám rád elektro, ale vypočujem si aj iné...
4.10.2007 09:35 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Reg. výraz na vyhľadanie určitých častí zo súboru
Odpovědět | | Sbalit | Link | Blokovat | Admin

Tohle řešení by bylo přípustné (předpokládá uvedené formátování)?

sed -n '/\[A\]/,/\[\/A\]/p' | \
   sed -n ':a;s#\[\/A\]#[/A]#;t b;N;b a;:b;/aaa/p'

PS: Možná by to šlo udělat na jeden průchod (bez roury).

I am always ready to learn although I do not always like to be taught. (W. Churchill)
Marián Oravec avatar 4.10.2007 09:49 Marián Oravec | skóre: 22 | Nitra
Rozbalit Rozbalit vše Re: Reg. výraz na vyhľadanie určitých častí zo súboru
No super. Toto funguje. Síce neviem pracovať s programom sed, ale pokiaľ neprídem na niečo lepšie, tak je toto použiteľné. O regulárny výraz mi išlo preto, lebo som to chcel používať priamo v Eclipse, Kate... Takto je to trocha nepraktické, ale lepšie, ako prechádzať 0.5 MB XML po riadkoch. :-)

V každom prípade ďakujem za pomoc.
Mám rád elektro, ale vypočujem si aj iné...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.