首先,我想知道是否有某种内置函数会检查正则表达式模式是否有效。我不想检查表达式是否有效 - 我只是想检查它以确保模式的语法有效 - 如果可能的话。
如果没有内置功能,我该怎么做?我还需要吗?
是否有我可以搜索的内置函数/模块的目录,所以我可以避免更多这样的问题?谢谢。
编辑:我应该提一下,我计划根据用户输入动态生成这些模式 - 这就是为什么我要验证它们以确保它们实际运行。
答案 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 #...