Regex 正则表达式-仅在一行中匹配单词一次
案例:Regex 正则表达式-仅在一行中匹配单词一次,regex,regex-negation,Regex,Regex Negation,案例: 再见,你好,再见 再见你好你好再见 我想匹配第1行(只有“hello”一次!) 不想匹配第2行(多次包含“hello”) 试着用消极的向前看向后看什么的。。。没有任何真正的成功。一个简单的选项是(使用多行标志,而不是全部点): 首先,检查两次您没有“hello”,然后至少检查一次您有“hello”。 还有其他方法可以检查相同的东西,但我认为这一个非常简单 当然,您可以简单地匹配\b hello\b并计算匹配数…因为您只担心单词(即用空格分隔的标记),所以您可以在空格上拆分,然后查看“he
还有其他方法可以检查相同的东西,但我认为这一个非常简单
当然,您可以简单地匹配
\b hello\b
并计算匹配数…因为您只担心单词(即用空格分隔的标记),所以您可以在空格上拆分,然后查看“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
通用正则表达式是:
^(?:\b(\w+)\b\W*(?!.*?\b\1\b))*\z
尽管颠倒这场比赛的结果可能会更干净:
\b(\w+)\b(?=.*?\b\1\b)
这是通过匹配一个单词并捕获它来实现的,然后通过前向和后向引用确保它不在字符串中的任何位置。为什么不只查找一次,然后检查它是否不存在?这样的重复似乎少了一点。@Wiseguy-像
^.*hello(?!*hello)
这样的模式不起作用,因为它总是匹配行的最后一个hello
。您需要类似于^(?(?!hello).*hello(?!hello)
的东西,这并不是很优雅。我可能错过了一些简单的事情…@Wiseguy-不。正则表达式引擎试图匹配,而不是失败。它可以匹配,所以它会匹配。工作,简单,易懂。Doh,我误读了这个问题,认为hello
可以是任何单词,正则表达式的目的是确保没有单词重复。将留下答案,以防任何人感兴趣。
\b(\w+)\b(?=.*?\b\1\b)