[Perl] Split op spaties zonder quotes.

Pagina: 1
Acties:

  • Roel Broersma
  • Registratie: Maart 2000
  • Laatst online: 29-04 18:40
Momenteel gebruik ik Perl code om een ingelezen regel uit een bestand te splitten in 5 variabelen.


( $a, $b, $c, $d, $e ) = split(/\s+/);

Dit werkt goed voor de volgende regel:

Peter klimt over de brug

Het werkt echter niet voor:

Peter klimt over de "rode brug"


Dit komt omdat hij Split op spaties. Nu schijn je de Split functie wel een tweede en derde argument mee te kunnen geven. In het tweede argument kun je dan een RegEx zetten. Dan kun je bijv. een deel laten skippen.
Ik zou bijv. wel een RegEx kunnen maken die alle spaties tussen dubbele-quotes eerst weghaald, maar staat er dan niet "rodebrug" aan elkaar vast in die $e variabele ?
Ik moet dus in feite de spaties tussen de dubbele-quotes negeren.

...don't know what should be here...


  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
of je vervangt die spatie door een teken(set) die je later weer terug kan veranderen naar een spatie

  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
Het hangt er een beetje vanaf hoe netjes je het wilt doen:

1. een simpele regexp die beide patronen matched, en dan de ongedefinieerde resultaten (die je daaraan inherent zijn) eruit greppen.
Perl:
1
print join ":", grep defined, ($string =~ /"(.*?)"|(\w+)/g);

2. [mooier] Maak gebruik van het al uitgevonden wiel in Text::ParseWords (zie ook 'perldoc perlfaq4')
Perl:
1
2
use Text::ParseWords
print join ":", quotewords(" ", 0, $string);


waarbij $string jouw string is...

  • Roel Broersma
  • Registratie: Maart 2000
  • Laatst online: 29-04 18:40
Joopst,

Tsja, dat dacht ik ook al, maar dat wou ik nou net niet doen...
Als ik een RegEx in de Split functie erbij zet, neem hij die dan mee als verandering ?

[ Voor 5% gewijzigd door Roel Broersma op 25-07-2005 09:10 ]

...don't know what should be here...


  • Roel Broersma
  • Registratie: Maart 2000
  • Laatst online: 29-04 18:40
Dankje wel richardt !, met die Text::Parsewords is het zeker goed te doen, net wat ik zocht! (met een losse RexExp. is toch redelijk ingewikkelder, zie ook deze link, waar het inderdaad stond;

"How can I split a [character] delimited string except when inside [character]?"

http://www.marcin-nolte.d...inside-%5bcharacter%5d%3f


PS. Ik heb nog wel even het plus-teken achter de spatie gezet, anders pakte hij meerdere lege 'cellen' achter elkaar.

[ Voor 4% gewijzigd door Roel Broersma op 25-07-2005 10:09 ]

...don't know what should be here...


  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
PS. Ik heb nog wel even het plus-teken achter de spatie gezet, anders pakte hij meerdere lege 'cellen' achter elkaar.
In dat geval kun je ook shellwords( $string ) gebruiken, i.p.v een delimiter en een $keep variabele op te geven, is nog korter...

[ Voor 15% gewijzigd door richardt op 25-07-2005 10:14 ]


  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
ik vind richardt gaaf :)
Pagina: 1