[Java] Regex probleempje

Pagina: 1
Acties:

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 18:11
Ik heb een klein probleempje waar ik niet uit kom: ik ben met regular expressions textfiles aan het parsen. In deze files staan meerder kolommen, met een vaste lengte. Hier door is het erg gemakkelijk om voor elke rij de kolomwaardes op te splitsen.
Neem bijvoorbeelde deze regel:
code:
1
100020050108BAY  23

Dit parse ik met de expressie:
code:
1
(\d{4})(\d{8})([\w ]{5})(\d{2})

Nu kan ik dus in java de verschillende groepen makkelijk verder gebruiken. Wat me alleen stoort is de derde groep ([\w ]{5}), dit veld moet ik nu elke keer trimmen om de spaties er uit te krijgen. Ik heb wel het een en ander geprobeerd met subgroepen, maar dat werk dus niet omdat ik dan de groep niet meer direct kan benaderen.
Overigens werkt het zo verder prima, maar ik vroeg me af of het anders kan en misschien leer ik nog iets van een regex goeroe hier.

Roomba E5 te koop


Verwijderd

Als het vaste waardes betreft, waarom gebruik je dan uberhaupt regex? Voldoet een eenvoudige substring niet gewoon voor jou?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
code:
1
(\d{4})(\d{8})(\w{3,5})\s{0,2}(\d{2})

Werkt dit?

Als het altijd maar 3 letters zijn, dan zou ik idd geen regex gebruiken, of als je dat toch wilt:
code:
1
(\d{4})(\d{8})(\w{3})\s{2}(\d{2})

[ Voor 54% gewijzigd door Michali op 13-04-2006 11:27 ]

Noushka's Magnificent Dream | Unity


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 18:11
Verwijderd schreef op donderdag 13 april 2006 @ 11:23:
Als het vaste waardes betreft, waarom gebruik je dan uberhaupt regex? Voldoet een eenvoudige substring niet gewoon voor jou?
Ik vind substrings niet netjes, en het past niet in de huidige opzet.
Michali schreef op donderdag 13 april 2006 @ 11:25:
code:
1
(\d{4})(\d{8})(\w{3,5})\s{0,2}(\d{2})

Werkt dit?
In principe wel, die had ik zelf ook verzonnen. Maar de expressie (\w{3,5})\s{0,2} garandeert niet een veldlengte van 5. Met deze input string
code:
1
100020050108AABA  A23

zou de match "AABA " zijn, 6 karakters lang dus. (Dit had ik overigens in de TS moeten vermelden, sorry).
Als het altijd maar 3 letters zijn, dan zou ik idd geen regex gebruiken, of als je dat toch wilt:
code:
1
(\d{4})(\d{8})(\w{3})\s{2}(\d{2})
Het kunnen helaas 1 tot 5 karakters zijn, dus dan zou de expressie uit jouw voorbeeld (\w{1,5})\s{0,4} worden, wat in sommige gevallen 9 karakters zou matchen.

Roomba E5 te koop


Verwijderd

sig69 schreef op donderdag 13 april 2006 @ 11:57:
Ik vind substrings niet netjes, en het past niet in de huidige opzet.
Euh, je moet natuurlijk zelf weten hoe je het doet, maar substring maakt het denk ik vele malen leesbaarder (en dat is uiteraard "netjes": leesbaarheid).
code:
1
2
3
String countryCode = line.substring(0,4);
String itemCode = line.substring(4, 12);
//etc

Lijkt me erg stug als dat niet in de huidige opzet past, maar ik neem het maar even van je aan :)


edit:
Ik zie nu dat je geen vaste waardes hebt zoals je in eerste instantie vermeld.

[ Voor 9% gewijzigd door Verwijderd op 13-04-2006 12:05 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 18:11
Nou ja, de kolommen hebben wel een vaste lengte, maar sommige velden zijn links uitgelijnd en andere rechts. In diverse bestanden kunnen ze ook in verschillende volgordes voorkomen. Dat is nu juist het probleem. Een expressie als (\w{3,5})\s{0,2} is opzich correct, alleen zou ik dan daarna willen toeveoegen dat de totale lengte van die expressie 5 is.

Roomba E5 te koop


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Volgens mij is dat niet mogelijk. Dan moet je gaan trimmen.

Noushka's Magnificent Dream | Unity

Pagina: 1