源字符串:
尝试仅提取语言名称。
我目前使用此代码
if($line =~ m!\s(.*)\(!)
{
print $1 . "\n" ;
}
但是我正在尝试使用quotemeta函数来完成它,我似乎无法做到。
my $regex = quotemeta( "\s(.*)\(" );
#Also tried as i suspect the \s is my problem.
my $regex = quotemeta( "\\s(.*)\(" );
if($line =~ m/$regex/)
{
print $1 . "\n" ;
}
是否优先于另一种风格?
答案 0 :(得分:6)
我不明白你在尝试使用quotemeta
。
如果你有真正的正则表达式语言,那么你不想引用它。
my $regex = qr/\s(.*)\(/;
if ($line =~ /$regex/) ...
如果你想引用它(你希望与字符串\s(..*)\(
完全匹配),你不需要明确地quotemeta
,但这实际上就是你现在所做的。
my $str = '\s(.*)\(';
if ($line =~ /\Q$str\E/) ...
答案 1 :(得分:2)
我同意@ephemient,这里不需要quotemeta。
我会使用/x
修饰符来使regexp更具可读性:
if($line =~ m/ \s (.*) \( /x )
并进一步采取行动
if($line =~ m/
\s # space
(.*) # capture anything
\( # up to and not including a (
/x )
一项改进。目前,您正在English
之后捕获空间。我会添加
if($line =~ m/
\s # space
(.*) # capture anythin
\s+ # up to and not including space
\( # a (
/x )
最后 - 看一看,如果你给它,你的程序会做什么
1. English (GB) (300 million)
2. Arabic (200 million (2005 value))
一个有效,另一个无效。可能无法理解为什么!