Re: perl Regexp für printable Unicode Characters
Hallo,
On Sun, Nov 03, 2024 at 01:53:50PM +0100, dh@dhaller.de wrote:
> 02.11.2024 19:05:44 Marc Haber <mh+debian-user-german@zugschlus.de>:
>
> > On Thu, 31 Oct 2024 22:21:20 +0100 (GMT+01:00), dh@dhaller.de wrote:
> >> Ein erster (defensiver) Stupser:
> >> ====
> >> use v5.14;
> >> # ...
> >> qr/[\w\d\.+!\$%&()\]\[;\/{}>*'@_-]+/aai;
> >> ====
> >
> > Hurga. Das ist aber schwere Kost, daran muss ich erstmal kauen. Kann
> > ein paar Tage dauern.
>
> Jo.
Schaltet /aai nicht Unicode quasi ab, weil \w nur ascii matched?
> Kann sein ich habs gefunden:
>
> "\p{Graph}"
> Matches any character that is graphic.
> Theoretically, this means a character that on a
> printer would cause ink to be used.
>
> Evtl. noch
> "\p{Word}"
> This is the same as "\w", including over 100_000
> characters beyond ASCII.
\p{Word} würde mir besser gefallen, das tut aber nicht so wie ich es
denke. Beispielcode weiter unten.
> Also:
> qr/^[\p{Graph}]+$/aa;
> qr/^[\p{L}\p{N}\p{S}\p{P}]+$/aa;
Ergibt das mit /aa einen Sinn? In meinem Beispiel sehe ich keinen
Unterschied zwischen "bare", "/aa" und "/aai".
Hier mal ein Beispielprogramm:
[47/5070]mh@swivel:~/tmp $ cat keks
#!/bin/perl -w
use strict;
use constant {
remax => qr/[\p{Word}\d\.+!\$%&()\]\[;\/{}>*'\@\_-]/aai,
regraph => qr/[\p{Graph}]/aa,
regraphaai=> qr/[\p{Graph}]/aai,
regraphbare=> qr/[\p{Graph}]/,
reword => qr/^[\p{Word}]$/aa,
rewordaai => qr/^[\p{Word}]$/aai,
rewordbare => qr/^[\p{Word}]$/,
};
my $string="homeÿar";
#my $string="/home/ar";
sub sanitize_string {
my ($input, $pattern) = @_;
if ($input =~ qr/^($pattern+)$/) {
return $1;
} else {
return "Input $input does not match $pattern";
}
}
print( sanitize_string( $string, remax ), "\n" );
print( sanitize_string( $string, regraph ), "\n" );
print( sanitize_string( $string, regraphaai ), "\n" );
print( sanitize_string( $string, regraphbare ), "\n" );
print( sanitize_string( $string, reword ), "\n" );
print( sanitize_string( $string, rewordaai ), "\n" );
print( sanitize_string( $string, rewordbare ), "\n" );
[48/5070]mh@swivel:~/tmp $ ./keks
Input homeÿar does not match (?^aai:[\p{Word}\d\.+!\$%&()\]\[;/{}>*'\@\_-])
homeÿar
homeÿar
homeÿar
Input homeÿar does not match (?^aa:^[\p{Word}]$)
Input homeÿar does not match (?^aai:^[\p{Word}]$)
Input homeÿar does not match (?^:^[\p{Word}]$)
[49/5070]mh@swivel:~/tmp $
ÿ ist "Latin small letter y with diaeresis", 0xFF, und sollte auf
\p{Word} matchen? Da es auf \p{Graph} matched scheint UTF-8 Processing
hier eingeschaltet zu sein.#
Ideen? Oder sollte ich mir sowas lieber de.comp.lang.perl gehen?
Grüße
Marc
--
-----------------------------------------------------------------------------
Marc Haber | "I don't trust Computers. They | Mailadresse im Header
Leimen, Germany | lose things." Winona Ryder | Fon: *49 6224 1600402
Nordisch by Nature | How to make an American Quilt | Fax: *49 6224 1600421
Reply to: