[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: