案例:
我想匹配第1行(只有'你好'一次!) 不要匹配第2行(不止一次包含'hello')
尝试使用负面向前看,但不是......没有任何真正的成功......
答案 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