2012-12-14 34 views
59

请考虑以下正则表达式,其中X任意正则表达式。正则表达式n或m次

X{n}|X{m} 

这正则表达式将测试X发生正是nm倍。

是否有一个正则表达式量词可以测试一个事件X究竟是nm倍?

+0

编号两个'X'的出现是你可以得到的最好的'm','n'。 –

回答

54

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

另一种方法是:

X{m}(X{k})? 

其中m < nkn-m值。

17

不,没有这样的量词。但我会重构它到/X{m}(X{m-n})?/,以防止problems in backtracking

+1

提供的链接非常有用,谢谢 –

33

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

  • ??? - 0或1 OCCURENCES(??是懒,?是贪婪)
  • **? - 任何数量的发生
  • ++? - 至少一次发生
  • {n} - 正是n OCCURENCES
  • {n,m} - nm OCCURENCES,包容
  • {n,m}? - nm OCCURENCES,懒
  • {n,}{n,}? - 至少n occurence

得到“确切的N或M“,你需要写量化的正则表达式两次,除非m,n是特殊的:

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

为什么在'm = 2n'示例中需要'?:'?似乎没有它为我工作正常。 – erb

+4

@erb如果你忽略'?:',那么这个组就成为一个捕获组。除了正则表达式引擎,它不需要,如果你在这个之后捕获了组,它们的ID将会改变。如果您使用正则表达式进行替换,则必须调整替换。 –

-3

你也可以硬编码,​​

+9

区别在哪里? –

+2

我最糟糕的时刻。 :/ – jackStinger

+0

当接受的答案显示这个解决方案是好的时,为什么这么低估? – ahstro

0

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

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

,或者在一个情况下,你可以有更多的序列比m“x”s(假设m> n),你可以添加'following no'x''和'后跟no no x,翻译为[^x](x{n}|x{m})[^x],但是假设在你之后总有一个字符“ ד。正如你可以在这里看到的:https://regex101.com/r/bB2vH2/1

你可以把它改成(?:[^x]|^)(x{n}|x{m})(?:[^x]|$),翻译成“跟随no'x'或跟随行开始'和'跟着不跟'x'或跟着行结束。但是,它仍然不匹配两个序列之间只有一个字符(因为第一个匹配需要一个字符之后,而第二个字符在之前),因为您可以在这里看到:https://regex101.com/r/oC5oJ4/1

最后,要匹配一个字符的距离匹配,您可以在“之后”的“否”x'后加上积极的眼神(?=),或者在之前的“否”x'之后加上积极的眼神(?< =),如下所示:https://regex101.com/r/mC4uX3/1

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

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