我有以下变量。如果变量有“imoport / canada / campingplaces / tobermory”而不是#或任何东西,我只想打印是。什么应该在正则表达式中插入这种东西。
my $textfile = "# imoport/canada/campingplaces/tobermory
imoport/canada/campingplaces/tobermory
#imoport/canada/campingplaces/tobermory";
my $textNeeded= "imoport/canada/campingplaces/tobermory"
这就是我正在使用的
if ($textfile =~ m/$textNeeded/i) {
print "yes working"
}
注意: - 我从不同的文本文件中获取数据,因此某些文本文件可能只有“#imioport / canada / campingplaces / tobermory”。我想避免那些
答案 0 :(得分:3)
尽管问题描述相当含糊,但我想我已经弄清楚了你的意思。您的意思是您可能会在文本中使用#
注释掉,并且您希望避免匹配这些内容。
print "yes" if $textfile =~ /^\s*$textNeeded/im;
这将匹配$textfile
内的任何字符串,其中包含换行符后跟可选的空格后跟字符串。 /m
选项生成正则表达式多行,这意味着^
和$
匹配较大字符串中换行符所代表的行结尾。
您可能希望警惕搜索字符串中的正则表达式元字符。例如,如果您的搜索字符串为foo[bar].txt
,则这些括号将被解释为字符类。在这种情况下,您将使用
/^\s*\Q$textNeeded\E/im
代替。 \Q ... \E
将使文本内部仅匹配文字字符。
答案 1 :(得分:1)
我认为如果您的目标字符串出现在该行的BEGINNING处,我认为您需要创建一个Anchor来表示您想要匹配。这使用了向上克拉符号:
if($ textfile = ~m / ^ $ textNeeded / i){ 打印“是的工作”
}
如果在textNeeded字符串之前有空格或制表符,则不会报告匹配项。
答案 2 :(得分:0)
简单地返回没有前导散列的行,如下所示:
my $textfile = "# imoport/canada/campingplaces/tobermory
imoport/canada/campingplaces/tobermory
#imoport/canada/campingplaces/tobermory";
for (split /^/, $textfile) {
print $_ if(m/^\s*[a-zA-Z].*/);
}
返回:
imoport/canada/campingplaces/tobermory