代码之家  ›  专栏  ›  技术社区  ›  David Waterworth

正则表达式匹配除k以外的任意数量的重复

  •  0
  • David Waterworth  · 技术社区  · 4 年前

    我正在尝试查找与以下模式不匹配的所有文本 ^([^\.]*\.){3}[^\.]*$ -即,任何文本以3个句点(.)例如XXX。XXX。XXX。XXX不匹配,XX。XX或XX。XX。XX。XX。XX没有。

    除了句点以外的任何字符都可以用来代替X,即我基本上想要计算字符串中的句点数,并通过计数进行过滤<&燃气轮机;3(上述表达式的作用相反,即当计数=3时匹配)

    1 回复  |  直到 4 年前
        1
  •  1
  •   HFZ    4 年前

    您可以对您不想要的内容使用负前瞻,如果条件满足,则可以捕获任何内容:

    总体思路:

    (?!^not_this_pattern$)^[\s\S]*$
    

    [\s\S] 捕获任何内容,包括新行(与 . )

    (?!^([^\.]*\.){3}[^\.]*$)^[\s\S]*$
    

    Demo

    或者使用条件运算符 | 对于要重复的图案(2个或更少)或(4个或更多):

    ^((?:[^\.]*\.[^\.]*){,2}|(?:[^\.]*\.[^\.]*){4,})$
    

    Demo

        2
  •  1
  •   Charlie Armstrong    4 年前

    首先,我将把你的问题简化到核心部分:如何匹配任何数量的重复,除了 k . 为此,我将把表达式简化为 x . 毕竟,这应该适用于任何表达式,所以最好从简单开始。

    Regex为我们提供了两个有用的构造:

    1. “n或更多”构造 {n,}
      • 这指定要重复此表达式 n 或者更多次。
    2. “范围”结构 {n,m}
      • 这指定您希望此表达式在两个表达式之间重复任意次数 N m 包含全部费用

    我们可以用正则表达式或符号把它们放在一起( | )匹配“介于1和之间” k - 1 {1,k-1} )及" k + 1 {k+1,} ),分别。我们正在使用 k-1 k+1 作为边界,因为这两个函数都是包含的,我们希望排除 K . 如果我们愿意 K 也就是说,3,我们将得到以下表达式:

    ^(x{1,2}|x{4,})$
    

    (?n) 哪里 N 表示您所指的捕获组。在本例中,我们将把模式放在第一个捕获组中,并使用 (?1) . 这给了我们:

    ^(x)((?1){0,1}|(?1){3,})$
    

    请注意,我使用0到1和3+作为量词,因为我们已经在模式的开头匹配了表达式一次。这里需要注意的一点是,并非所有风格的正则表达式都支持这种语法。PCRE(和PCRE2)支持它,但Python、Golang、Java和ECMAScript不支持。

    现在我们只剩下插入你的模式了。非常简单,我们可以把它放在哪里

    使用第一种方法,如果您没有使用PCRE或您有一个简短的表达式:

    ^(([^\.]*\.){1,2}|([^\.]*\.){4,})[^\.]*$
    

    使用第二种方法,如果使用PCRE,并且有一个长表达式:

    ^([^\.]*\.)((?1){0,1}|(?1){3,})[^\.]*$