regex - 有没有办法在单个语句中将某个函数的返回值编译成正则表达式?

标签 regex perl

我需要构建一个匹配给定哈希中任何键的正则表达式。这可以通过以下方式轻松实现

my $string = join('|', keys %hash);
my $regex = qr/$string/;

在哪里 %hash是有问题的哈希。出于好奇:有没有办法避免引入虚拟变量 $string并直接将任意函数的返回值编译成正则表达式(定义自定义子或原型(prototype)除外)?公式不同:qr也有函数形式(如 readpipeqx )?

提前致谢!

最佳答案

您可以将任意代码插入到任何双引号结构(qq、qr、qx)中。$foo插入一个标量变量。 ${ code-returing-a-scalar-reference }插入任意代码。因此,为了避免虚拟变量,您可以:

my $regex = qr/${ \join('|', keys %hash) }/;

但正如评论中提到的,如果你只想匹配等于其中一个键的字符串,你想添加 \A (或 ^ )和 \z anchor 。否则,您将匹配包含其中一个键的任何字符串。

如果您的键可能包含正则表达式元字符,您还需要引用它们,例如:
my $regex = qr/\A(?:${ \join('|', map quotemeta, sort keys %hash) })\z/;

关于regex - 有没有办法在单个语句中将某个函数的返回值编译成正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61412329/

相关文章:

c++ - Boost正则表达式如何将Cookie字符串解析为map<string, string>?

regex -\Q 和\E 内的哈希值

python - 如何检查字符串是否仅包含 “a-z” 、 “A-Z” 和 “0-9” 个字符

c - C中二进制比较的错误

Perl Module Net::DNS - 在解析器对象上调用 "tsig"方法会导致错误

regexp_replace 负前瞻清理电子邮件地址

javascript - 使用 javascript 和正则表达式删除 HTML 字符串中的第一个 img 标签

linux - 系统 ("linux_command") 与 Perl 库函数

regex - 如何在 Perl 中用正则表达式 grep 字符串?

perl - IO::Prompter - 是否可以禁用历史记录?