正则expression式n或m次
考虑下面的正则expression式,其中X
是任何正则expression式。
X{n}|X{m}
这个正则expression式会testingX
正好 n
次或m
次。
是否有一个正则expression式量词可以testing一个事件X
正好n
或m
次?
没有一个单一的量词意味着“正好m或n次”。 你这样做的方式很好。
另一种方法是:
X{m}(X{k})?
其中m < n
和k
是nm
的值。
这里是量词的完整列表(参考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})