我正在使用Perl和grep命令在数组输出中查找模式。 我有兴趣在数组中搜索以下文本:
/tmp/12345.hash
12345
可以是任何数字序列,例如234
或567889
,但是/tmp/
和.hash
将保持一致。我对regex不太满意,因此不确定如何构建正确的regex语句。
@line = grep /hash/, @exp;
我最初的搜索只是看单词hash,但在其他行上匹配,结果我得到了错误的结果。
答案 0 :(得分:4)
Regex允许您以更高的精度将需求编码为“模式”:
my @filtered = grep { m{^/tmp/[0-9]+\.hash$} } @all;
我将{}
用作定界符,因为对于普通的//
,必须将模式中的每个/
都转义。然后,在前面需要m
(与//
分隔符不同,在分隔符中可以省略它)。
锚点^
匹配字符串的开头(如果/m
“修饰符”有效,则匹配其他位置)†。 /tmp
似乎是路径的开始,但是如果前面有(例如)前导空格,则上述内容将不匹配(除非您将其更改为^\s*/tmp
,以便允许可选空格)。仔细考虑您的数据。
$
与字符串的末尾匹配,或者如果有一个(/m
修饰符对此进行了更改),则在末尾的换行符之前匹配†。要在hash
之后匹配更多字符的字符串,请删除$
。
模式本身使您在问题描述中所讲的内容定下来:必须有一个整数,该整数是变化的,其余的是固定的。
教程perlretut随附了Perl自己的(优秀)文档。
†使用修饰符$str =~ /.../m
,该字符串被视为多行字符串,因此如果其中包含换行符,则^
和{{1} }中的正则表达式也匹配每行的开头和结尾。
始终仅匹配字符串结尾的锚点是$
(另请参见\z
,它与\Z
匹配,但对$
不敏感)。请参阅Assertions in perlre,并在this page上查看答案。