Answers:
这是量词的完整列表(请参阅http://www.regular-expressions.info/reference.html):
?
,??
-0或1次出现(??
懒惰,?
贪婪)*
,*?
-任何数量的事件+
,+?
-至少发生一次{n}
- n
确实发生{n,m}
- n
对m
出现次数,包容{n,m}?
- n
对m
出现次数,懒惰{n,}
,{n,}?
-至少n
发生要获得“恰好是N或M”,您需要两次编写量化的正则表达式,除非m,n特殊:
X{n,m}
如果 m = n+1
(?:X{n}){1,2}
如果 m = 2n
?:
在if m = 2n
示例中需要?似乎没有它,对我来说一切正常。
?:
,该组将成为捕获组。除了正则表达式引擎无需记住其他内容外,如果您在此之后捕获组,则它们的ID也会更改。如果使用正则表达式进行替换,则必须调整替换。
TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
看起来您想要“ xn次”或“ xm次”,我认为对正则表达式的字面翻译应该是(x{n}|x{m}).
这样https://regex101.com/r/vH7yL5/1
或者,在一个情况下,在这里可以具有大于M“×”更多的序列(假定M> N),则可以添加“以下没有‘×’”和“随后没有‘×’,翻译到[^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
最后,要匹配一个字符的远距离匹配,您可以在“后不加x”前添加正视(?=),或在“后不加x”前添加正视(?<=),像这样:https : //regex101.com/r/mC4uX3/1
(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
这样,您将只匹配所需的确切数量的“ x”。
看一看Enhardened的答案,他们指出倒数第二个表达式不会匹配仅包含一个字符的序列。有一种简单的方法可以解决此问题,而无需使用向前/向后看,而是用边界字符替换开始/结束字符。这使您可以与包括开始/结束在内的单词边界进行匹配。因此,适当的表达应为:
(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)
如您所见:https : //regex101.com/r/oC5oJ4/2。
X
不会。一般情况下m
,您会得到两次最好的出现n
。