【问题标题】:Regex to match substrings containing n non-repeated characters正则表达式匹配包含 n 个非重复字符的子字符串
【发布时间】:2022-12-07 20:11:04
【问题描述】:

我正面临正则表达式的(幼稚)问题。 我需要找到由固定数量 (n) 的不同字符组成的任何子字符串。

因此,对于“aaabcddd”,如果 n=3,我希望找到的子字符串是:“abc”和“bcd”。

我的想法是使用 n-1 捕获组和 '[^' 来排除已经匹配的字符。因此,我编写了以下 Perl 正则表达式(在 Julia 中):

r"(([[:alpha:]])[^\2])[^\1]"

但是,它不起作用。

你有什么建议吗?

【问题讨论】:

  • 代码的出现?

标签: regex perl


【解决方案1】:

您不能使用否定字符类 [^] 对捕获组使用反向引用

您可以做的是使用否定前瞻来断言当前位置右侧的内容不是您已经在前一组中捕获的内容。

如果是这种情况,请在新组中捕获单个 alpha。

匹配项abcbcd 在捕获组 1 中

(?=(([[:alpha:]])(?!)([[:alpha:]])(?!|)[[:alpha:]]))
  • (?=积极前瞻
    • (捕获第 1 组
      • ([[:alpha:]]) 捕获第一个字符第 2 组
      • (?!)([[:alpha:]])如果不看右边第2组捕获的内容,捕获第二个字符第 3 组
      • (?!|) 如果不向右看第 2 组或第 3 组捕获的内容
      • [[:alpha:]]马赫第三个字符
    • )关闭群1
  • )关闭前瞻

Regex demo

或者使用不区分大小写的匹配更短一点:

(?=(([a-z])(?!)([a-z])(?!|)[a-z]))

【讨论】:

    【解决方案2】:

    下面是n字符任意值的解决方法:

    #!/usr/local/bin/perl
    
    use strict; use warnings; use feature ':5.10';
    
    my $s="aaabcded";
    my $n=3;
    
    while ($s=~/(?=([[:alpha:]]{$n}))/g){
        my $hit=$1;
        my @chars = split //, $hit;  
        my %uniq; 
        @uniq{@chars} = ();
        say "$hit" if (scalar keys %uniq) == $n;
    }
    

    使用$n=3 打印运行:

    abc
    bcd
    cde
    

    使用$n=4 打印运行:

    abcd
    bcde
    

    还有$n=5

    abcde
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2016-04-21
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多