Regex 将变量用作正则表达式模式

Regex 将变量用作正则表达式模式,regex,perl,variables,Regex,Perl,Variables,我想使用一个变量作为正则表达式模式来匹配文件名: my $file = "test~"; my $regex1 = '^.+\Q~\E$'; my $regex2 = '^.+\\Q~\\E$'; print int($file =~ m/$regex1/)."\n"; print int($file =~ m/$regex2/)."\n"; print int($file =~ m/^.+\Q~\E$/)."\n"; 结果(或日期): 有人能给我解释一下如何将变量用作正则表达式模式吗?不能在

我想使用一个变量作为正则表达式模式来匹配文件名:

my $file = "test~";
my $regex1 = '^.+\Q~\E$';
my $regex2 = '^.+\\Q~\\E$';
print int($file =~ m/$regex1/)."\n";
print int($file =~ m/$regex2/)."\n";
print int($file =~ m/^.+\Q~\E$/)."\n";
结果(或日期):


有人能给我解释一下如何将变量用作正则表达式模式吗?

不能在单引号/非插值字符串中使用
\Q
。它必须被雷克瑟看到

总之,蒂尔德不是元角色

添加
使用regex“debug”
,您将看到实际发生的情况。

如所述:


因此,请使用
qr
quote-like操作符。

谢谢,我使用
$regex=~s/\\Q(.*)\\E/quotemeta($1)/ge
替换\Q..\E.还有其他方法吗?@user72757是的,首先不要将
\Q
\E
放在字符串中。奇怪的是,有人问到RegEx是一个变量,但讨论似乎转移到
\Q
\E
。:/use RegEx“debug”给出了一个错误。我发现使用“重新调试”是有效的。这正是我想要的!我会给你150英镑的赏金points@GlassGhost-你是在读这篇文章之前还是之后打开赏金的?你必须等到比赛结束后才能得分吗?无论如何,
qr/
创建了一个regex对象,但是您必须小心地输入它。如果是文字,则必须首先对其运行quotemeta()。@sln您必须等待24小时才能花掉赏金。@sln我很难让递归正则表达式在第22行工作:@GlassGhost-很清楚,
$RecursiveEGEX
是一个变量名,并不表示递归正则表达式。我看了你的github代码。我不确定你在做什么,所以我将只解决你遇到的错误。您正在替换表单
s///e
上使用eval修饰符。替换端将作为代码执行,并将结果返回给调用方regex引擎。对于代码来说,任何包装在paren中的东西都是与操作符隔离的。
0
0
1
    $re = qr/$pattern/;
    $string =~ /foo${re}bar/; # can be interpolated in other patterns
    $string =~ $re; # or used standalone
    $string =~ /$re/; # or this way