我有一个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"匹配的代码作为一个完整的单词并且它有效.我想在问之前我应该多考虑一下:)
您可以使用\ 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
| 归档时间: |
|
| 查看次数: |
679 次 |
| 最近记录: |