Schrift
[thread]11923[/thread]

Wortgrenzen, Umlaute und reguläre Ausdrücke

Leser: 1


<< >> 9 Einträge, 1 Seite
Gast Gast
 2008-05-27 17:07
#110367 #110367
Hi Freunde,
habe folgendes Codefragment:
Code: (dl )
1
2
"Ärgerlich" =~ '\b\w*e\w*\b';
print $&;

Die Ausgabe ist rgerlich.

Wo ist das Ä geblieben?
renee
 2008-05-27 17:14
#110369 #110369
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Je nach LOCALE-Einstellung gehört das *nicht* in die Klasse von \w...

Siehe auch perllocale und perlre
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
GwenDragon
 2008-05-27 17:21
#110372 #110372
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Welches locale hat dein System?
Ist das UTF im Skript?
moritz
 2008-05-27 17:52
#110377 #110377
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Wenn der String als Textstring interpretiert wird matcht auch \w das Ä ganz korrekt. Siehe auch Charsets und Unicode in Perl
havi
 2008-05-28 11:34
#110389 #110389
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Code: (dl )
1
2
3
use locale;
"Ärgerlich" =~ '\b\w*e\w*\b';
print $&;
moritz
 2008-05-28 11:56
#110390 #110390
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Locales würde ich nur noch benutzen, wenn nichts mehr anderes hilft. Sie sind fehleranfällig, ein eventuelles Sicherheitsrisiko (siehe perlsec und perllocale), und vor allem sehr beschränkt. Wenn jetzt jemand ein &#269; im Namen hat, soll man das dann nicht von \w erkennen lassen, nur weil es kein "deutsches" Zeichen ist?

Heutzutage kann man es sich eigentlich nicht mehr leisten, nur mit den aktuellen locales zu arbeiten, insbesondere bei Webservices. Wo locales IMHO noch akzeptabel sind ist das sortieren von Strings. Ansonsten sollte man den Unicode-Weg gehen.
moritz
 2008-05-28 12:00
#110391 #110391
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
moritz+2008-05-28 09:56:04--
Wenn jetzt jemand ein &#269; im Namen hat,


Da sieht mans mal wieder - ich wollte den
U+010D LATIN SMALL LETTER C WITH CARON
schreiben, und was macht $board? Unfug! Kommt anscheinend nicht gut mit Unicode zurecht. Leute, wenn ihr selbst Programme schreibt, probiert es besser zu machen ;-)
Gast Gast
 2008-05-28 14:50
#110399 #110399
Danke erstmal für die vielen Antworten,
war gestern leider schon aus dem Netz, als die ersten eintrudelten.

Habe Eure Vorschläge getestet und es funktioniert mit:
Code: (dl )
use utf8;

und mit:
Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl -w

use Encode qw(encode decode);

$\ = "\n";

decode('utf-8',"Ärgerlich") =~ '\b\w*e\w*\b';
print $&;

use local hat leider ebensowenig funktioniert wie setlocale aus perllocale, also:
Code: (dl )
setlocale(LC_CTYPE, "de_DE.UTF-8");

vorrausgesetzt, ich habe alles richtig gemacht
Linuxer
 2008-05-29 00:55
#110423 #110423
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Zur Verwendung von $&:

'perldoc perlre'
...
WARNING: Once Perl sees that you need one of $& , $` , or $' anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program. Perl uses the same mechanism to produce $1, $2, etc, so you also pay a price for each pattern that contains capturing parentheses. (To avoid this cost while retaining the grouping behaviour, use the extended regular expression (?: ... ) instead.) But if you never use $& , $` or $' , then patterns without capturing parentheses will not be penalized. So avoid $& , $' , and $` if you can, but if you can't (and some algorithms really appreciate them), once you've used them once, use them at will, because you've already paid the price. As of 5.005, $& is not so costly as the other two.
...


perldoc perlre
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< >> 9 Einträge, 1 Seite



View all threads created 2008-05-27 17:07.