[Perl/Regexp]eerste letters uppercase en spaties verwijderen

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
Ik wil van een zin in perl alle spaties verwijderen en alle eerste letters van de woorden een hoofdletter maken. Ook de eerste letter moet een hoofdletter worden. Dus zoiets als:

"wordt   behandeld  door " of "  wordt behandeld    door"

wordt dan

"WordtBehandeldDoor"

Nu heb ik weinig ervaring met reguliere expressies. Wel al gevonden dat s/ //g alle spaties verwijderd. En dat je met /u alle eerstvolgende letters een hoofdletter laat zijn, echter krijg ik de combinatie niet werkend. Kan dit wel zo? En wat doen de s en de g eigenlijk precies in de expressie?

[ Voor 35% gewijzigd door Krooswijk.com op 08-04-2006 21:39 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 11:39

Creepy

Tactical Espionage Splatterer

Misschien ligt het aan mij maar ik zou een loopje maken die zoekt tot een spatie, de spatie verwijderd en het teken wat nu op de plek staat een hoofdletter maken totdat er geen spaties meer zijn. i.p.v. een regexp.. Ook in perl is dat prima te doen en een stuk simpeler (en zeker niet langzamer) dan een regexp.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Zoiets?
code:
1
2
3
4
5
$zin = 'wordt behandeld     door';
$zin =~ s/\s*\b(.)/\u\1/g;
print $zin;

Dit levert: WordtBehandeldDoor
  • De eerste 's' betekent 'substitute', namelijk het stuk tussen de 1e /.../ door de 2e /.../
  • 'g' wil zeggen 'global', oftewel voor elke instantie in de zin. Zonder 'g' wordt de vervangingsactie maar 1 keer uitgevoerd.
  • \s staat voor 'whitespace', dus spatie/tab. Het sterretje er direct achter wil zeggen 0, 1 of meer, dus elke willekeurige lengte van spaties. 0 moet het ook kunnen zijn, omdat de eerste letter van de zin waarschijnlijk geen spatie is, maar wel moet worden verhoofdletterd.
  • \b betekent 'boundary', de grens tussen whitespace en non-whitespace; je geeft er het begin van een woord mee aan.
  • De eerste letter na de woordbegrenzing wordt hier aangeduid met een '.' (punt). Een '.' kan elk willekeurig karakter zijn, maar vanwege de \b ervoor moet het hier wel een 'word-character' zijn. Door de punt tussen haakjes te zetten wordt ie opgeslagen in een buffer. Deze buffer is terug te halen met \1 (cijfertje 1) in het vervangingsdeel.
Met een loopje kan het natuurlijk ook:
code:
1
2
3
4
5
$zin = 'wordt behandeld     door';
for $woord (split /\s+/, $zin) {
   print ucfirst $woord;
}
print "\n";

Op z'n Perls kan dat for-loopje natuurlijk korter, dus $_ gebruiken:
code:
1
2
3
for (split /\s+/, $zin) {
   print ucfirst $_;
}

Die $_ kan overigens ook nog weg, ucfirst neemt dat default al als argument.
Nog eentje, in Perl is het tenslotte een sport om zoveel mogelijk weg te strepen 8) :
code:
1
print ucfirst for split /\s+/, $zin;

Ook leuk, want in Perl kan/moet alles op 1001 manieren:
code:
1
map { print ucfirst } split /\s+/, $zin;