如何验证用户输入中的 Perl 正则表达式?

Gor*_*don 2 regex perl

我从用户那里得到了一个假设有效的 perl 正则表达式值的输入列表。例子可以是:

  • \b[Bb]anana\b
  • \s*Apples[BANANA]\s+

有没有一种安全的方法来验证这些字符串?

bri*_*foy 7

首先,考虑您想让用户使用模式做多少事情。Perl 正则表达式可以运行任意代码。

但是,为了验证您是否可以使用字符串作为模式而不导致致命错误,您可以使用运算符qr//来编译字符串并返回正则表达式。如果出现问题,则会qr出现致命错误,您可以使用以下命令捕获该错误eval

my $pattern = eval { qr/$input/ };
Run Code Online (Sandbox Code Playgroud)

如果您返回undef,则该模式无效。而且,尽管问题中有评论,但仍有无数种方法可以制作无效模式。我知道,因为我一直用手输入它们,而且我还没有用尽方法来搞砸:)

这不会将模式应用于字符串,但您可以使用它$pattern来进行匹配:

if( $pattern ) {
    $target =~ $pattern;  # or $target =~ m/$pattern/
    }
Run Code Online (Sandbox Code Playgroud)