Regex 正则表达式的问题
我有一个perl文件,它接收txt文件,并将它们与另一个txt文件中的其他单词进行比较(如果它们匹配),然后将该文件移动到另一个文件夹 我当前遇到以下错误:Regex 正则表达式的问题,regex,perl,text-files,matching,Regex,Perl,Text Files,Matching,我有一个perl文件,它接收txt文件,并将它们与另一个txt文件中的其他单词进行比较(如果它们匹配),然后将该文件移动到另一个文件夹 我当前遇到以下错误: Unmatched ( in regex; marked by <-- HERE in m/\b( <-- HERE who\b/ at filter.pl line 45. 我不知道它是否与文件的其余部分有任何关系,但我会把我的代码放上去以防万一 $dirtoget="/Users/jennie/crimes/"; open
Unmatched ( in regex; marked by <-- HERE in m/\b( <-- HERE who\b/ at filter.pl line 45.
我不知道它是否与文件的其余部分有任何关系,但我会把我的代码放上去以防万一
$dirtoget="/Users/jennie/crimes/";
opendir(IMD, $dirtoget) || die("Cannot open directory");
@thefiles= readdir(IMD);
foreach $f (@thefiles){
if ($f =~ m/.txt/){
#print "matches a txt file\n";
#print $f;
open (FILE, "/Users/jennie/crimes/$f")or die"Cannot open FILE";
if ( FILE eq "" ) {
close FILE;
}
else{
# print "In the Else\n";
while (<FILE>) {
foreach $word(split) {
foreach $x (@triggers) {
if ($x =~ m/\b$word\b/) {
print $word,"\n";
print $f,"\n";
copy("/Users/jennie/crimes/$f","/Users/jennie/crimeStories/$f")or die "Copy failed: $!";
close FILE;
}
}
}
}
}
}
}
closedir(IMD);
exit 0;
$dirtoget=“/Users/jennie/crimes/”;
opendir(IMD,$dirtoget)| | die(“无法打开目录”);
@thefiles=readdir(IMD);
foreach$f(@thefiles){
如果($f=~m/.txt/){
#打印“匹配一个txt文件\n”;
#打印$f;
打开(文件“/Users/jennie/crimes/$f”)或死亡“无法打开文件”;
如果(文件eq“”){
关闭文件;
}
否则{
#打印“在Else中”\n;
而(){
foreach$word(拆分){
foreach$x(@triggers){
如果($x=~m/\b$word\b/){
打印$word,“\n”;
打印$f,“\n”;
复制(“/Users/jennie/crimes/$f”,“/Users/jennie/crimeStories/$f”)或死“复制失败:$!”;
关闭文件;
}
}
}
}
}
}
}
closedir(IMD);
出口0;
这个错误对我来说没有多大意义,我根本不是正则表达式方面的天才:-(您正在将
$word
的内容直接插入正则表达式中。这意味着$word
中的任何元字符都将被解释为元字符,可能会破坏您的正则表达式
如果要匹配$word
的文字内容,请使用\Q
和\E
:
$x =~ m/\b\Q$word\E\b/
此外,正如@goresplater在评论中提到的,页面上还有另一个损坏的正则表达式:
$f =~ /.txt/
首先,
是一个匹配任何字符的元字符。其次,它没有锚定-如果该字符序列出现在文件名的任何位置,正则表达式将成功。因此,例如,它将匹配“thisisnottxtfile.bin”
您可以使用模块仅提取文件扩展名并对其进行测试,也可以通过转义
并将其锚定到文件名末尾来修改正则表达式:
$f =~ /\.txt$/
这可能是因为
$word
包含元字符。a(
在本例中,表示捕获组的开始。这意味着您的正则表达式将被破坏,因为$word
可以包含元字符。您可以使用\Q
和\E
确保$word
的内容被“引用”,以便它们不会被解释为元字符:
$x=~m/\b\Q$word\E\b/
还有更多的信息
编辑
根据tchrist的评论,\b
在这种情况下没有意义,除非您可以确保$word
只包含字母数字字符。但一般来说,要解决问题,请使用:
$x = m/\Q$word\E/
这难道不符合
$word
而不是$word
中的内容吗?@goresplater:不,变量插值即使在\Q-\E
中也会发生。看看perlop-它明确指出,不能在\Q-\E
中包含一个文本$/code>,因为它会被插值。回答得好,这个n、 你能在你的答案中暗示一下$f=~m/.txt/
吗?除非你能保证$word
只包含字母数字字符,否则在它周围使用\b
几乎肯定是错误的。你明白当$word
包含“fred”时发生的区别吗当它包含“(弗雷德)”?我认为整个方法从一开始就是有缺陷的。@tchrist很好的观点。\b
s没有意义,除非你能确保$word
只包含字母数字字符。我甚至没有想到。你是对的,它会更坏。谢谢,那更好。请参阅我对OP的q的长篇评论上面的问题是,可能是,也可能不是,一对对空格敏感的边界可能更符合人们对\b
的期望。问题是,你必须将它们具体地写为左边缘或右边缘。你不能只有一个适用于bo的边定义这与我在那里给出的\b
和\b
定义的工作方式不同。好吧,对于“工作”的价值有时相当可疑,也就是说:@tchrist我在Perl方面的经验和知识仍然停留在业余水平,因为我是自学(使用Perl)的不要真的专业地做perl。这些微妙之处常常让我难以理解。了解它们很好,所以谢谢你的解释!嘿,我和你一样是perl autodidact!:)我不相信\b
在这里是合适的。记住\b
真的意思是(?:(?\b
真的意思是(?)(?\b
并不表示类似于(?)?
$x = m/\Q$word\E/