Regex 正则表达式-仅在一行中匹配单词一次

Regex 正则表达式-仅在一行中匹配单词一次,regex,regex-negation,Regex,Regex Negation,案例: 再见,你好,再见 再见你好你好再见 我想匹配第1行(只有“hello”一次!) 不想匹配第2行(多次包含“hello”) 试着用消极的向前看向后看什么的。。。没有任何真正的成功。一个简单的选项是(使用多行标志,而不是全部点): 首先,检查两次您没有“hello”,然后至少检查一次您有“hello”。 还有其他方法可以检查相同的东西,但我认为这一个非常简单 当然,您可以简单地匹配\b hello\b并计算匹配数…因为您只担心单词(即用空格分隔的标记),所以您可以在空格上拆分,然后查看“he

案例:

  • 再见,你好,再见
  • 再见你好你好再见
  • 我想匹配第1行(只有“hello”一次!) 不想匹配第2行(多次包含“hello”)

    试着用消极的向前看向后看什么的。。。没有任何真正的成功。

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

    首先,检查两次您没有“hello”,然后至少检查一次您有“hello”。
    还有其他方法可以检查相同的东西,但我认为这一个非常简单


    当然,您可以简单地匹配
    \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)