Perl bietet kein solches Dienstprogramm. Es analysiert Regex-Muster; es erzeugt sie nicht. Die Zeichenfolge des Objekts ist die genaue Zeichenfolge, die dem Parser bereitgestellt wird und in eine Zeichenfolge eingeschlossen ist, die (?:...)
die Flags berücksichtigt. Die dem Parser bereitgestellte Zeichenfolge ist das Post-Interpolations-Literal abzüglich der Trennzeichen. [1]
Dies wäre jedoch mit einem Regex-Parser trivial.
Es gibt YAPE :: Regex , aber es wurde schon lange nicht mehr aktualisiert. Zum Beispiel unterstützt es nicht die (?^:...)
in der Stringifizierung von Regex in der modernen Version von Perl gefundene.
Es gibt auch Regexp :: Parser . Es ist neuer, aber es unterstützt auch nicht (?^:...)
! Aber wenn wir das umgehen würden, wäre es perfekt, da Leerzeichen und Kommentare natürlich ignoriert werden! Alles, was wir tun müssen, ist das Muster zu analysieren und eine Zeichenfolge aus dem Analysebaum zu erhalten.
Schließlich gibt es Regexp :: Parsertron . Es ist das neueste und unterstützt zwar (?^:...)
, unterscheidet jedoch keine Leerzeichen und Kommentare von Token mit "exakten Übereinstimmungen".
Verwenden wir also Regexp :: Parser. [2]
#!/usr/bin/perl
use strict;
use warnings;
use feature qw( say );
use Regexp::Parser qw( );
{
@ARGV == 1
or die("usage\n");
my $re = $ARGV[0];
# R::P doesn't support «(?^:...)», so we'll
# provide a backwards-compatible stringification.
$re =~ s{^\(\?\^(\w*):}{
my %on = map { $_ => 1 } split //, $1;
my $on = join "", grep $on{$_}, qw( i m s x );
my $off = join "", grep !$on{$_}, qw( i m s x );
"(?$on-$off:"
}e;
my $parser = Regexp::Parser->new($re);
my $roots = $parser->root
or die($parser->errmsg);
say join "", map $_->visual, @$roots;
}
Prüfung:
$ despace_re '(?^x:
(?=\d|\.\d) # look-ahead to ensure at least one of the optional parts matches
\d* # optional whole digits
(?:\.\d*)? # optional decimal point and fractional digits
)'
(?x-ims:(?=\d|\.\d)\d*(?:\.\d*)?)
\Q
, \u
Und ähnliche sind in der gleichen Stufe bei Interpolation. \N{...}
wird aufgelöst, \N{U+...}
um die aktuellen Einstellungen für Zeichennamen zu verewigen. Andere Fluchten wie \x27
, \x{0000027}
, \\
und \/
werden Zeichen für Zeichen erhalten.
Eine auf YAPE :: Regex basierende Lösung wurde in einer früheren Überarbeitung dieser Antwort verwendet.