2011-05-25 114 views
0

我正在搜索单词“移动”,并且我想匹配“移动”以及打印时。正则表达式匹配后缀到英文单词

我要对这个办法是:

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到_PEP ....)。

其中$search_keyd$search_key."d",它的工作!

一个很好的补充是检查单词是否以e结尾,因此只需要添加一个d。我猜想它看起来像这样:e?$/d$

即使一般的答案就足够了。

我是新来的Perl。所以很抱歉,如果这是基本的。提前致谢!!!

+0

标题不完全符合您的要求。为清晰起见,您可能想要重新修改它。 – Greg 2011-05-25 14:10:40

+0

你也想配合“移动”吗? – tadmc 2011-05-25 21:19:01

回答

2

如果我理解正确,您想要搜索"move"并添加高亮显示,但也包括基本单词的任何变体,例如"moves" "moved"

当你在这样的文本替换的话,通常要更换所有的话,那么你需要的/g操作上的正则表达式,像这样:

$subsentences[$i] =~ s/$search_key/ **$search_key** /ig 

而且,你应该确保不匹配单词的部分。例如。你想匹配"move",但不是"remove"。对于这一点,你可以用\b标记字boundry:

$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

+0

非常感谢您的一步一步! ($ search_key [$ i] =〜/ e $/i)我刚更改了 ($ subsentences [$ i] =〜/ e $/i){$ suffix ='(s | d)'} 至 ){$ suffix ='(s | d)'} 然后分开s和d个案例,因为它们对应不同的案例。非常感谢! – Jon 2011-05-25 17:12:31

+0

啊,当然是。你想检查搜索模式,而不是文本。 =)我的坏。我会解决这个问题。 – TLP 2011-05-25 20:12:56

0

如果你想要匹配所有以你的搜索词开始的完整单词,即'move'匹配'move','moved','movers'等,那么你想用一个字符类来检测这个词的结尾。

因此,而不是:

if ($sentence =~ /($search_key)d$/i) 

尝试使用:

if ($sentence =~ /($search_key\w*)\W$/i) 

的\ W *将匹配任何数量的标准的文字字符,\ W应该阻止您包括其他字符,如空格或标点符号。

+0

雅我有,除了印刷声明,它也必须打印这个词,这并没有真正的工作...我也不想要搬家或移动等...它仍然需要作为一个移动动词,所以移动和移动现在是好的...移动[se * d]也许? – Jon 2011-05-25 14:13:09

+0

@Jon:你不能以这种方式在角色类中使用*,但即使你可以匹配移动和移动,但它也会匹配我认为你想要的moveee。 – Greg 2011-05-25 14:30:01

+0

@Jon:为什么这样一个具体的匹配方案?你想用这个做什么? – Greg 2011-05-25 14:30:55