正则表达式匹配带素数长度的字符串?

时间:2019-05-07 09:56:30

标签: regex pcre

给出一个带有任意数量的'x'字符(xxxxxxxxxxxxxxxxxxxxx等的输入字符串),如何写一个仅当素数为'x'字符时才与输入字符串匹配的正则表达式?长度为1的字符串不应该匹配。

例如:

匹配这些: xx xxx xxxxx xxxxxxx

但不是这些: x xxxx xxxxxxxxx

这是我发现的一个解决方案-^(?!(xx+)\1+$)here,是对this问题的解答)。但是,我想知道它为什么起作用。请也分享其他替代解决方案。

我正在使用PCRE引擎。

我意识到人们通常不会将正则表达式用于这种事情。我只是对如何完成感到好奇。

2 个答案:

答案 0 :(得分:3)

^(?!(xx+)\1+$)

通过在行的开头执行负前瞻进行工作。它将拒绝包含以下内容的任何行

  • 两个或多个x es
  • 跟着相同数量的x,可能是多次

换句话说,正则表达式的工作原理是匹配任意数量的x,这些{不能被分成多个相等大小的较小的大小相等的组,大小大于等于2。

要排除仅一个x的情况,可以使用^(?!(xx+)\1+$|x$)

答案 1 :(得分:0)

我认为正则表达式不是正确的工具。为什么需要这样做?

如果您不能对字符串的长度做任何假设,则需要检查数字是否以某种方式是质数(这在计算上是昂贵的)。

如果知道最大长度,则可以预先计算素数,然后根据它们检查长度,但是使用regex进行此操作仍会不必要地复杂。

因此,我唯一知道的方法是使用\b(\d{2}|\d{3}|\d{5})\b,正如您所知,它将很快变得很麻烦。