我有以下代码
my @txt = ("Line 1. [foo] bar",
"Line 2. foo bar",
"Line 3. foo [bar]"
);
my $regex = qr/^
Line # Bare word
(\d+)\. # line number
\[ # Open brace
(\w+) # Text in braces
] # close brace
.* # slurp
$
/x;
my $nregex = qr/^\s*Line\s*(\d+)\.\s*\[\s*(\w+)\s*].*$/;
foreach (@txt) {
if ($_ =~ $regex) {
print "Lnum $1 => $2\n";
}
if ($_ =~ $nregex) {
print "N Lnum $1 => $2\n";
}
}
N Lnum 1 => foo
我期待两个正则表达式都是等价的,只捕获数组的第一行。但只有$nregex
有效!
如何修复$regex
以便它也可以相同地工作(使用x选项)?
根据回复,更新了正则表达式并且它可以正常工作。
my $regex = qr/^ \s*
Line \s* # Bare word
(\d+)\. \s* # line number
\[ \s* # Open brace
(\w+) \s* # Text in braces
] \s* # close brace
.* # slurp
$
/x;
答案 0 :(得分:4)
你的两个表达方式不一样。您需要在第一个中包含\ s *位。 / x允许您编写整齐格式的表达式 - 您已经注意到了评论。因此,/ x版本中的空格不被认为是重要的,并且不会对任何匹配活动做出贡献。
换句话说,你的/ x版本相当于
qr/^Line(\d+)\.\[(\w+)].*$/x
顺便说一下,只有一个普通的空间而不是\ s *或\ s +也会失败很多次;您的示例数据在几个地方包含两个彼此相邻的空格。这两个地方不匹配一个空格。
最后提示:当你必须在某个位置至少有一个空格时,你应该使用\ s +来强制执行至少一个空格。一旦你知道可能的话,你肯定可以找出在你的模式中可能有用的地方。