正则expression式n或m次

考虑下面的正则expression式,其中X任何正则expression式。

 X{n}|X{m} 

这个正则expression式会testingX 正好 n次或m次。

是否有一个正则expression式量词可以testing一个事件X正好nm次?

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

另一种方法是:

 X{m}(X{k})? 

其中m < nknm的值。

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

  • ??? – 0或1次发生( ??是懒惰, ?是贪婪)
  • **? – 任何次数的发生
  • ++? – 至less有一次发生
  • {n} – 恰好是n
  • {n,m}n ,包括在内
  • {n,m}?n发生,懒惰
  • {n,}{n,}? – 至lessn

为了得到“正确的N或M”,除非m,n是特殊的,否则需要将量化的正则expression式写两次:

  • 如果m = n+1 X{n,m}X{n,m}
  • (?:X{n}){1,2}如果m = 2n

不,没有这样的量词。 但是我将它重构为/X{m}(X{mn})?/以防止回溯中的问题 。

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

看起来你想要“xn次”或“xm次”,我认为直译为正则expression式是(x{n}|x{m}). 像这样https://regex101.com/r/vH7yL5/1

或者如果可以有一个多于m个“x”(假设m> n)的序列,则可以添加“跟随号”x“”和“跟随无”x“,转换为[^x](x{n}|x{m})[^x]但是假设在“x”之后总是有一个字符。 正如你可以看到这里: https : //regex101.com/r/bB2vH2/1

您可以将其更改为(?:[^x]|^)(x{n}|x{m})(?:[^x]|$) ,转换为“和“跟着没有'x'或跟着行结束”。 但是,它仍然不会匹配两个序列之间只有一个字符(因为第一个匹配将需要一个字符之后,第二个字符之前),你可以看到这里: https : //regex101.com/r/ oC5oJ4 / 1

最后,为了匹配一个字符远的匹配,可以在“之后”的“否”x之后的“no”x“后面加上积极的眼神(?=)像这样: https : //regex101.com/r/mC4uX3/1

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

这样你只会匹配你想要的'x'的确​​切数量。

你也可以硬编码它, (X{n})|(X{m})