正则表达式 - 仅匹配一次单词

时间:2012-01-06 21:39:21

标签: regex regex-negation

案例:

  1. ehello再见hellot hello goodbye
  2. ehello再见你好再见
  3. 我想匹配第1行(只有'你好'一次!) 不要匹配第2行(不止一次包含'hello')

    尝试使用负面向前看,但不是......没有任何真正的成功......

3 个答案:

答案 0 :(得分:6)

一个简单的选项就是这个(使用多行标志而不是全点):

^(?!.*\bhello\b.*\bhello\b).*\bhello\b.*$

首先,检查两次“你好”,然后检查你是否至少有过一次。
还有其他方法可以检查相同的东西,但我认为这个很简单。

当然,您可以简单匹配\bhello\b并计算匹配数...

答案 1 :(得分:2)

通用正则表达式将是:

^(?:\b(\w+)\b\W*(?!.*?\b\1\b))*\z

尽管反转这场比赛的结果可能更干净:

\b(\w+)\b(?=.*?\b\1\b)

这可以通过匹配一个单词并捕获它来实现,然后通过前瞻和反向引用确保它在字符串中的任何位置跟随它。

答案 2 :(得分:1)

由于您只担心单词(即由空格分隔的标记),您可以只分割空格并查看"hello"出现的频率。由于你没有提到语言,这里是Perl中的一个实现:

use strict;
use warnings;

my $a1="ehello goodbye hellot hello goodbye";
my $a2="ehello goodbye hello hello goodbye";

my @arr1=split(/\s+/,$a1);
my @arr2=split(/\s+/,$a2);

#grab the number of times that "hello" appears

my $num_hello1=scalar(grep{$_ eq "hello"}@arr1);
my $num_hello2=scalar(grep{$_ eq "hello"}@arr2);

print "$num_hello1, $num_hello2\n";

输出

1, 2