Perl không cung cấp một tiện ích như vậy. Nó phân tích các mẫu regex; nó không tạo ra chúng. Việc xâu chuỗi của đối tượng là chuỗi chính xác được cung cấp cho trình phân tích cú pháp, được gói trong một (?:...)
tài khoản cho các cờ. Chuỗi được cung cấp cho trình phân tích cú pháp là chuỗi ký tự sau nội suy trừ các dấu phân cách. [1]
Điều đó nói rằng, điều này sẽ không quan trọng để làm với trình phân tích cú pháp regex.
Có YAPE :: Regex , nhưng nó đã không được cập nhật trong một thời gian dài. Ví dụ, nó không hỗ trợ (?^:...)
tìm thấy trong chuỗi chuỗi regex trong phiên bản hiện đại của Perl.
Ngoài ra còn có Regapi :: Parser . Nó mới hơn, nhưng nó cũng không hỗ trợ (?^:...)
! Nhưng nếu chúng ta giải quyết vấn đề đó, nó sẽ thật hoàn hảo vì tự nhiên bỏ qua khoảng trắng và bình luận! Tất cả những gì chúng ta cần làm là phân tích mô hình và nhận được một chuỗi nghiêm ngặt từ cây phân tích cú pháp.
Cuối cùng, có Regapi :: Parsertron . Đây là phiên bản mới nhất và nó hỗ trợ (?^:...)
, nhưng nó không phân biệt khoảng trắng và nhận xét với mã thông báo "khớp chính xác".
Vì vậy, hãy sử dụng Regapi :: 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;
}
Kiểm tra:
$ 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
Và tương tự được thực hiện tại cùng một sân khấu tại nội suy. \N{...}
được giải quyết để \N{U+...}
bất tử các cài đặt tên hiện tại. Thoát khác như \x27
, \x{0000027}
, \\
và \/
được bảo quản nhân vật cho nhân vật.
Một giải pháp dựa trên YAPE :: Regex đã được sử dụng trong phiên bản trước của câu trả lời này.