正则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+1X{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})