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