正则表达式恰好是n OR m次

FTh*_*son 90 php java regex

考虑以下正则表达式,其中X任何正则表达式.

X{n}|X{m}
Run Code Online (Sandbox Code Playgroud)

这个正则表达式将测试恰好或时间X发生. nm

是否有一个正则表达量词可以X准确地测试一次nm一次?

Mar*_*ers 81

没有单一的量词意味着"恰好m或n次".你这样做的方式很好.

另一种选择是:

X{m}(X{k})?
Run Code Online (Sandbox Code Playgroud)

在哪里m < nk是的价值n-m.


Joh*_*rak 53

以下是量词的完整列表(参见http://www.regular-expressions.info/reference.html):

  • ?,??- 0或1次出现(??懒惰,?贪婪)
  • *,*?- 任意数量的出现
  • +,+?- 至少一次出现
  • {n}-正是nOCCURENCES
  • {n,m}- n出现m,包容性
  • {n,m}?- nm出现次数,懒惰
  • {n,},{n,}?-至少noccurence

要获得"正好N或M",您需要两次编写量化的正则表达式,除非m,n是特殊的:

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

  • @erb如果省略`?:`,该组将成为一个捕获组.除了正则表达式引擎记住它没有必要的东西,如果你在此之后有捕获组,它们的ID将会改变.如果您使用正则表达式替换,则必须调整替换. (6认同)
  • 为什么在 if `m = 2n` 示例中需要 `?:`?没有它对我来说似乎工作正常。 (2认同)

Ber*_*rgi 19

不,没有这样的量词.但我会重组它/X{m}(X{m-n})?/以防止回溯问题.


Dan*_*Dan 8

很旧的帖子,但我想贡献一些可能有帮助的东西。我已经完全按照问题中所述的方式进行了尝试,它确实有效,但有一个问题:数量的顺序很重要。考虑一下:

#[a-f0-9]{6}|#[a-f0-9]{3}
Run Code Online (Sandbox Code Playgroud)

这将找到所有出现的十六进制颜色代码(它们的长度为 3 或 6 位)。但当我像这样翻转它时

#[a-f0-9]{3}|#[a-f0-9]{6}
Run Code Online (Sandbox Code Playgroud)

它只会找到 3 位数字或 6 位数字的前 3 位数字。这确实有道理,正则表达式专业人士可能会立即发现这一点,但对于许多人来说,这可能是一种奇怪的行为。有一些高级正则表达式功能可以避免这个陷阱,无论顺序如何,但并不是每个人都深入了解正则表达式模式。