为什么这个Perl正则表达式不起作用?

Car*_*ers 2 regex perl

我有一个Perl脚本,应该匹配这个字符串:

Sometimes, he says "hey fred, what's up?"

它说如果它在单词的开头,结尾或中间发现了fred,或者它只是发现了"fred".所以它与Alfred和Frederich相匹配.

好吧,在这个字符串中,它应该说它自己发现了fred,但是它说它在一个单词的开头找到了它.这是fred开头的正则表达式(它是在if-elsif阶梯中开始的单词,单词结束,只是fred,单词的中间):

if(/.*\s+[fF][rR][eE][dD][^ \t\r\n,.:;'"].*/){
    print "found fred at beginning of a word:\n    $_\n";
Run Code Online (Sandbox Code Playgroud)

我用[^ \t\r\n,.:;'"]而不是在\S这个词之后加上一些标点符号.显然,它不是一个详尽的标点符号列表,但它对于这个例子并不重要,因为它后面跟着一个逗号.

这是一个foreach循环...如果它意味着什么,这是Learning Perl 5th ed中的练习7-1 .

更新

书中的练习是写一个Perl程序,在单词列表中找到"fred".然后它问,脚本是否在"弗雷德里希"或"阿尔弗雷德?"中找到了弗雷德?然后它说写一个文本文件,谈论Fred Flinstone和他的朋友,并将其用作脚本的输入.

我想通了,有点:在写下我忘记的问题时,我必须改变一些东西:我再次测试它,而不是匹配一个单词的开头,它只是说它在任何地方找到它.所以问题并不在于它认为它只是在一个词的开头,而是它认为它不是单词中唯一的东西.我添加[,.:;'"]?\s+了与"fred"匹配的代码作为一个完整的单词并且它有效.我想在问之前我应该​​多考虑一下:)

Dav*_*ous 9

您可以使用\ b作为单词边界,使用\ w作为单词字符,而且,对于不区分大小写的/ i修饰符比使用[fF]等更清晰.

就像是:

if ($st =~ m{\b fred \w+ }xi) {
    print "Found fred at the beginning of a word";
} else {
    print "Not found";
}

如果你需要将'fred'作为一个单词本身,那么请使用\b fred \b.

我建议您阅读http://perldoc.perl.org/perlre.html

  • 可能值得指出最初的提问者,由于x标志,这个正则表达式中的空格基本上被忽略了 (3认同)
  • 好点Cebjyre./ x修饰符会导致正则表达式中的空格被忽略,这意味着您可以使用空格来使其更具可读性.在长正则表达式中,这可能非常有价值,从而降低与线噪声的相似性.这是我同意的Damian Conway的Perl最佳实践书中的众多建议之一. (2认同)