Toon posts:

[regex] probleem met herhaling

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi allen,

Ik zit al een tijdje te knoeien op een reguliere expressie en had graag jullie hulp gehad. De input is volgende file (versimpeld):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
BEGIN FINANCIAL INFORMATION
0
4
John
6
3
8
END FINANCIAL INFORMATION

BEGIN FINANCIAL INFORMATION
0
David
6
8
END FINANCIAL INFORMATION

BEGIN FINANCIAL INFORMATION
2
4
7
4
0
3
John
6
8
END FINANCIAL INFORMATION


Tussen BEGIN FINANCIAL INFORMATION en END FINANCIAL INFORMATION bevinden zich een heel rijtje getallen, met daartussen ergens de naam waarover het gaat.

Nu had ik graag alle gegevens van John uitgelezen. Ik kom tot volgende reguliere expressie:

code:
1
BEGIN FINANCIAL INFORMATION.*?John.*?END FINANCIAL INFORMATION


Het probleem hier is dat de tweede
code:
1
.*?
ook
code:
1
END FINANCIAL INFORMATION
herkent. Het probleem is dus dat volgende substring ook een geldige match is.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BEGIN FINANCIAL INFORMATION
0
David
6
8
END FINANCIAL INFORMATION

BEGIN FINANCIAL INFORMATION
2
4
7
4
0
3
John
6
8
END FINANCIAL INFORMATION


Kunnen jullie mij helpen met deze reguliere expressie? Ik ben al een tijdje aan het knoeien om het volgende uit te drukken, maar tot dusver zonder succes.

code:
1
.*? - behalve de string "END FINANCIAL INFORMATION"


Heel erg bedankt in ieder geval!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Kan iemand aub. de titel vervolledigen - bijv. in [regex] probleem met herhaling. Dank je.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik snap niet zo goed waarom je een bestand als dit wilt analyseren met een regular expression. Wat veel beter is, is een hele simpele parser schrijven die bij elke BEGIN FINANCIAL INFORMATION een nieuwe array/map/dictionary maakt, bij elke waarde een waarde daaraan toevoegt, en bij END FINANCIAL INFORMATION alle output leest tot de volgende BEGIN...

Zo heb je heel eenvoudig en "goedkoop" het bestand geparset, en hoef je alleen nog maar wat arrays/objecten af te lopen met een loopje.

Wil je dit toch met een regular expression doen, zorg dan in elk geval dat je Perl compatible expressions gebruikt, en niet POSIX. Die zijn waardeloos als je meer dan hele simpele functionaliteit wilt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zondag 02 december 2007 @ 14:01:
Ik snap niet zo goed waarom je een bestand als dit wilt analyseren met een regular expression. Wat veel beter is, is een hele simpele parser schrijven die bij elke BEGIN FINANCIAL INFORMATION een nieuwe array/map/dictionary maakt, bij elke waarde een waarde daaraan toevoegt, en bij END FINANCIAL INFORMATION alle output leest tot de volgende BEGIN...

Zo heb je heel eenvoudig en "goedkoop" het bestand geparset, en hoef je alleen nog maar wat arrays/objecten af te lopen met een loopje.

Wil je dit toch met een regular expression doen, zorg dan in elk geval dat je Perl compatible expressions gebruikt, en niet POSIX. Die zijn waardeloos als je meer dan hele simpele functionaliteit wilt.
Er zijn twee redenen waarom ik hiervoor reguliere expressies wil gebruiken:

- Het wordt dringend tijd dat ik er eens mee leer werken. Bij wijze van oefening dus.
- Ik heb het voorbeeld zoals hier gegeven heel erg versimpeld. In mijn concrete data zien de gegevens er tussen BEGIN en END heel wat complexer uit. Door middel van sub-expressies kan ik in één ruk alle relevante data ophalen. Aangezien dit niet onmiddellijk van toepassing is voor mijn vraag hier, heb ik het probleem eenvoudig voorgesteld.

Ik gebruik idd. perl compatible expressies (is standard behaviour bij boost::regex).

Dankjewel!

Acties:
  • 0 Henk 'm!

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 15-09 18:04

TrailBlazer

Karnemelk FTW

wat cheatah zegt. Je moet gewoon het hele bestand doorlopen. Als je de tekst tegenkomt BEGIN FINANCIAL INFORMATION alle variabelen opslaan tot en met END FINANCIAL INFORMATION in een temp variabele. Als je dan de naam tegenkomt deze naam op de een of andere manier linken met de temp variabele.

Acties:
  • 0 Henk 'm!

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
Als je weet dat de rest getallen zijn kun je daar toch op matchen?

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Het nut van regexps is vrij beperkt, en het is in ieder geval niet hierbij. Bij het tokenizen voor een parser kunnen regexps handig zijn, of bij een snelle search and replace in een document. Voor dit soort dingen is een parser makkelijker, leesbaarder en veel makkelijker te onderhouden.

* ValHallASW wijst nog even subtiel naar zijn signature ;)
Pagina: 1