如何在Perl中检查正则表达式模式是否有效?

时间:2009-07-10 23:33:03

标签: regex perl

首先,我想知道是否有某种内置函数会检查正则表达式模式是否有效。我不想检查表达式是否有效 - 我只是想检查它以确保模式的语法有效 - 如果可能的话。

如果没有内置功能,我该怎么做?我还需要吗?

是否有我可以搜索的内置函数/模块的目录,所以我可以避免更多这样的问题?谢谢。

编辑:我应该提一下,我计划根据用户输入动态生成这些模式 - 这就是为什么我要验证它们以确保它们实际运行。

4 个答案:

答案 0 :(得分:20)

我不是Perl专家,但也许this可以提供帮助:

#!/usr/bin/perl

my $pattern = "["; # <-insert your pattern here
my $regex = eval { qr/$pattern/ };
die "invalid regex: $@" if $@;

返回:

invalid regex: Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE / at test.pl line 4.

对于第二个问题,您可以随时查看CPAN上的大量工作。

答案 1 :(得分:2)

我不太确定你的“有效”是什么意思。如果表达式在语法上不符合要求(例如,缺少括号),那么解释器会通知您,并且您的程序将无法编译。

但这并不能保护您免受逻辑或语义错误的影响。也就是说,你的正则表达式可能是有效的Perl,但做的很糟糕 - 或根本不做任何事情。也许你想要像YAPE::Regex::Explain这样的东西来解释你的正则表达式。

答案 2 :(得分:1)

您可以使用的另一个cpan模块:Regexp::Parser。来自文档:

my $parser = Regexp::Parser->new;
if (! $parser->regex($rx)) {
  my $errmsg = $parser->errmsg;
  my $errnum = $parser->errnum;
  # ...
}

答案 3 :(得分:0)

例如,在 Bash 脚本中:

#!/bin/bash

pattern='12[3';
printf '%s' "$pattern" | perl -ne 'eval { qr/$_/ }; die if $@;';
echo $?;

# Outputs (if the pattern is invalid):
#
# Unmatched [ in regex; marked by <-- HERE in m/12[ <-- HERE 3/ at -e line 1, # <> line 1.
#         ...propagated at -e line 1, <> line 1.
# 255

# If valid:
#
# 0

#!/bin/bash

pattern='12[3';

if
    printf '%s' "$pattern" \
    | perl -ne 'eval { qr/$_/ }; die if $@;' &> '/dev/null';
then
    printf 'Valid\n';
else
    printf 'Invalid\n';
fi

另外,应该可以使用环境变量:

#!/bin/bash

export pattern='12[3';

if perl -ne 'eval { qr/$ENV{pattern}/ }; die if $@;' &> '/dev/null';
then #...

相关:Reference 1Reference 2