Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式的问题_Regex_Perl_Text Files_Matching - Fatal编程技术网

Regex 正则表达式的问题

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

我有一个perl文件,它接收txt文件,并将它们与另一个txt文件中的其他单词进行比较(如果它们匹配),然后将该文件移动到另一个文件夹

我当前遇到以下错误:

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/