我正在搜索“移动”这个词,我想在打印时也匹配“移动”。
我的方式是:
if ($sentence =~ /($search_key)d$/i) {
$search_key = $search_keyd;
}
$subsentences[$i] =~ s/$search_key/ **$search_key** /i;
$subsentences[$i] =~ s/\b$parsewords[1]_\w+/ --$parsewords[1]--/i;
print "MATCH #$count\n",split(/_\S+/,$subsentences[$i]), "\n";
$count++;
这是较长代码的一部分,所以如果有什么不清楚请告诉我。 _是因为句子中的单词被标记(例如I_NN move_VB to_PREP ....)。
$search_keyd
$search_key."d"
哪个有效!
一个很好的补充是检查单词是否以e结尾,因此只需要附加一个d。我猜它看起来像这样:e?$/d$
即使是一般答案也足够了。
我是Perl的新手。很抱歉,如果这是基本的。在此先感谢!!!
答案 0 :(得分:2)
如果我理解正确,您想要搜索"move"
并添加突出显示,还要包含基本字词的任何变体,例如"moves" "moved"
。
当您替换这样的文字中的单词时,通常需要替换所有单词,然后在正则表达式上需要/g
运算符,如下所示:
$subsentences[$i] =~ s/$search_key/ **$search_key** /ig
此外,您应该确保不匹配部分单词。例如。您想匹配"move"
,但不是"remove"
。为此,您可以使用\b
标记单词边界:
$subsentences[$i] =~ s/\b$search_key/ **$search_key** /ig
为了匹配某些后缀,您需要一个包含有效字符或字符组合的字符类。 move[sd]
会找到"moves"
和"moved"
。但是,对于像"jump"
这样的词,您需要更具体一点:"jump(s|ed)"
。请注意,[sd]
可以替换为(s|d)
。因此,除非您的文字中出现任何拼写错误,否则您可以放弃:
$subsentences[$i] =~ s/\b$search_key(s|d|ed)/ **$search_key$1** /ig
请注意$1
匹配第一个匹配括号内的任何内容。
查找匹配单词的数量:
my $matches = $subsentences[$i] =~ s/\b$search_key(s|d|ed)/ **$search_key$1** /ig
如果你想更具体地使用后缀,即使它不匹配像"moveed"
这样拼写错误的单词,你需要做一些特殊的匹配。类似的东西:
if ($search_key =~ /e$/i) { $suffix = '(s|d)' }
else { $suffix = '(s|ed)' }
my $matches = $subsentences[$i] =~ s/\b$search_key$suffix/ **$search_key$1** /ig
您添加的搜索字词可能会变得非常复杂。
有关正则表达式here
的一些帮助答案 1 :(得分:0)
如果你想要的是匹配所有以搜索词开头的完整单词,即'move'匹配'move','move','movers'等,那么你想使用一个字符类来检测这个词的结尾。
所以,而不是:
if ($sentence =~ /($search_key)d$/i)
尝试使用:
if ($sentence =~ /($search_key\w*)\W$/i)
\ w *将匹配任意数量的标准单词字符,\ W应该阻止您包含其他字符,例如空格或标点符号。