Regex perl中正则表达式的特殊问题
我正在尝试打印当前目录中没有尾随“~”字符的所有文件名。 目录中的文件包括:Regex perl中正则表达式的特殊问题,regex,perl,Regex,Perl,我正在尝试打印当前目录中没有尾随“~”字符的所有文件名。 目录中的文件包括: mnt.txt xyz.pl abc.pl abc.pl~ 输出应该是 mnt.txt xyz.pl abc.pl 我使用以下逻辑: @arr= qx( ls -A ); $pattern = "[a-z|A-Z|0-9]*\.[a-z]*[^~]"; foreach $fname (@arr){ if ( $fname =~ m/${pattern}/g ) { print $fname; } 但它不起作用,它
mnt.txt
xyz.pl
abc.pl
abc.pl~
输出应该是
mnt.txt
xyz.pl
abc.pl
我使用以下逻辑:
@arr= qx( ls -A );
$pattern = "[a-z|A-Z|0-9]*\.[a-z]*[^~]";
foreach $fname (@arr){
if ( $fname =~ m/${pattern}/g )
{
print $fname;
}
但它不起作用,它需要所有的文件名
但是,如果我将$pattern
更改为“[a-z | a-z | 0-9]*\.pl[^~]”
,则其输出是正确的
我能做些什么来解决这个问题?请引导,因为我希望显示包括文本在内的所有文件。尽量避免解析
ls
的输出。或者,您可以使用opendir()
和readdir()
函数读取目录内容,并使用grep()
对其进行过滤,如:
perl -e '
opendir $dh, q|.|;
for ( grep { ! m/~$/ } readdir $dh ) {
printf "%s\n", $_
}
'
尽量避免分析
ls
的输出。或者,您可以使用opendir()
和readdir()
函数读取目录内容,并使用grep()
对其进行过滤,如:
perl -e '
opendir $dh, q|.|;
for ( grep { ! m/~$/ } readdir $dh ) {
printf "%s\n", $_
}
'
@Birei的回答是正确的,但要回答您的问题,您必须锚定您的正则表达式:
$pattern = qr"^[a-zA-Z0-9]+\.[a-z]+[^~]$";
@Birei的回答是正确的,但要回答您的问题,您必须锚定您的正则表达式:
$pattern = qr"^[a-zA-Z0-9]+\.[a-z]+[^~]$";
但是我得到了模式“[a-z | a-z | 0-9]*\.pl[^~]”的o/p。为什么它匹配一个而不匹配另一个?@Samboy786:character类中的管道没有您认为它具有的含义。Last
[^~]
使正则表达式至少匹配一个字符。\.pl
与txt
文件不匹配。您的正则表达式既不使用锚点作为字符串的开头也不使用锚点作为字符串的结尾。它在很多方面都失败了,非常感谢。我从@M42那里得到了答案。我注意到我在结尾没有使用\$,这造成了问题。但是我得到了模式“[a-z | a-z | 0-9]*\.pl[^~]”的o/p。为什么它匹配一个而不匹配另一个?@Samboy786:character类中的管道没有您认为它具有的含义。Last[^~]
使正则表达式至少匹配一个字符。\.pl
与txt
文件不匹配。您的正则表达式既不使用锚点作为字符串的开头也不使用锚点作为字符串的结尾。它在很多方面都失败了,非常感谢。我从@M42那里得到了答案。我注意到我在结尾没有使用\$,这造成了问题。不需要解析整个文件名qr/[^~]$/
就可以了。不需要解析整个文件名qr/[^~]$/
就可以了。