正则表达式恰好是n OR m次

时间:2012-12-14 08:03:32

标签: java php regex

考虑以下正则表达式,其中X任何正则表达式。

X{n}|X{m}

此正则表达式将测试发生完全 Xn次的m

是否有正则数量词可以测试出现X完全nm次?

6 个答案:

答案 0 :(得分:74)

没有单一的量词意味着“恰好m或n次”。你这样做的方式很好。

另一种选择是:

X{m}(X{k})?

其中m < nkn-m的值。

答案 1 :(得分:46)

以下是量词的完整列表(参考http://www.regular-expressions.info/reference.html):

  • ??? - 0或1次出现(??是懒惰的,?是贪婪的)
  • **? - 任意数量的出现
  • ++? - 至少发生一次
  • {n} - 确切n出现
  • {n,m} - nm出现,包括
  • {n,m}? - nm出现,懒惰
  • {n,}{n,}? - 至少n出现

要获得“正好N或M”,您需要将量化的正则表达式写入两次,除非m,n是特殊的:

  • X{n,m} if m = n+1
  • (?:X{n}){1,2} if m = 2n
  • ...

答案 2 :(得分:18)

不,没有这样的量词。但我会将其重组为/X{m}(X{m-n})?/以阻止problems in backtracking

答案 3 :(得分:3)

TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

看起来你想要“x n次”或“x次”,我认为对正则表达式的字面翻译将是(x{n}|x{m}). 像这样https://regex101.com/r/vH7yL5/1

或者,如果你的序列可以超过m“x”s(假设m> n),你可以添加'follow no“x”'和'后跟no“x”,翻译到[^x](x{n}|x{m})[^x],但是假设在“x”之后总是有一个字符。正如您在此处所见:https://regex101.com/r/bB2vH2/1

您可以将其更改为(?:[^x]|^)(x{n}|x{m})(?:[^x]|$),转换为“关注无'x'或跟随行开始”和“后跟无'x'或后跟行尾”。但是,它仍然不会匹配两个序列之间只有一个字符(因为第一个匹配后需要一个字符,第二个匹配前面的字符),如下所示:https://regex101.com/r/oC5oJ4/1

最后,为了匹配一个字符的远距离匹配,你可以在“no'x'之后添加一个正向前看(?=)或者在”no“x后面的正面看起来(?&lt; =) '之前',像这样:https://regex101.com/r/mC4uX3/1

(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

这样您只会匹配'x'的确​​切数量。

答案 4 :(得分:1)

看看Enhardened的回答,他们说他们的倒数第二个表达式不会匹配它们之间只有一个字符的序列。有一种简单的方法来解决这个问题,而不使用向前看/向后看,那就是用边界字符替换开始/结束字符。这使您可以匹配包含开始/结束的字边界。因此,适当的表达应该是:

(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)

正如您在此处所见:https://regex101.com/r/oC5oJ4/2

答案 5 :(得分:1)

非常老的帖子,但我想提供一些帮助。 我已经按照问题中所述的方式进行了尝试,并且确实起作用,但是有一个问题: 数量顺序很重要。考虑一下:

#[a-f0-9]{6}|#[a-f0-9]{3}

这将查找所有出现的十六进制颜色代码(它们为3或6位数字)。但是当我像这样翻转它

#[a-f0-9]{3}|#[a-f0-9]{6}

它将仅找到3位数字或6位数字的前3位。这确实是有道理的,并且Regex专业人士可能会立即发现这一点,但是对于许多人来说,这可能是一种特殊的行为。有一些高级Regex功能可以避免此陷阱,而不管顺序如何,但并不是每个人都深陷Regex模式。