我大约一周前才开始学习perl,但是我对regex的一些特性有基本的了解,比如反向引用,查找等等,所以我写了一个小的regex来匹配一个数组中的字符串(这个数组代表了文件的每一行),这个数组只有'{'作为可打印字符。
我的正则表达式是这样的
for my $f_line (@file_lines) {
my @opening_brace;
if ($f_line =~ /(^[[:blank:]]*(?={))({[[:blank:]]*$)/) {
@opening_brace = $2;
print "opening brace : @opening_brace \n";
}
}
然而,我的正则表达式不能让我进入if块,即使当我针对目标文件测试grep
时,它工作正常。
我做错了什么?
我试过:
echo "{ " | grep -P '(^[[:blank:]]*(?={))({[[:blank:]]*$)'
得到:{
2条答案
按热度按时间s4n0splo1#
哦,我刚刚找到了一个修正。看起来我的文件“行”并不是真正的行。问题在于字符串的逻辑行和表示文件行开始和结束的文字锚之间的细微差别,文字锚是在我将行作为字符串推入数组时创建的。感谢帮助
3zwjbxry2#
这里逐字复制的正则表达式可以工作
打印
{
。但是在您指定的那个正则表达式中没有
$2
,因为该正则表达式只捕获一次,您似乎希望lookahead的(?=...)
也捕获:不需要,我们需要额外的括号,所以要么加上它,要么用$1
。那么,我不明白为什么要使用前瞻 * 和 * 实际消耗匹配。(练习?)