Perlはそのようなユーティリティを提供していません。正規表現パターンを解析します。それらは生成されません。オブジェクトの文字列化は、パーサーに提供される正確な文字列(?:...)
であり、フラグを説明するにラップされます。パーサーに提供される文字列は、補間後のリテラルから区切り文字を引いたものです。[1]
とは言っても、これは正規表現パーサーで行うのは簡単です。
YAPE :: Regexがありますが、長い間更新されていません。たとえば(?^:...)
、Perlの最新バージョンの正規表現の文字列化で見つかったはサポートされていません。
Regexp :: Parserもあります。新しいですが、(?^:...)
どちらもサポートしていません!しかし、それを回避するのであれば、空白やコメントは自然に無視されるので完璧です!パターンを解析し、解析ツリーから文字列を取得するだけです。
最後に、あります正規表現:: Parsertronが。これは最新で、をサポート(?^:...)
していますが、空白とコメントを「完全一致」トークンと区別していません。
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;
}
テスト:
$ 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
および同様の処理が補間の同じ段階で行われます。現在の文字名設定を不滅にするために\N{...}
解決さ\N{U+...}
れます。、、およびなどの他のエスケープ\x27
は\x{0000027}
、文字ごとに保持されます。\\
\/
YAPE :: Regexに基づくソリューションは、この回答の以前のリビジョンで使用されていました。