给出一个带有任意数量的'x'字符(x
,xx
,xxxxx
,xxxxxxxxxxxxx
等的输入字符串),如何写一个仅当素数为'x'字符时才与输入字符串匹配的正则表达式?长度为1的字符串不应该匹配。
例如:
匹配这些:
xx
xxx
xxxxx
xxxxxxx
但不是这些:
x
xxxx
xxxxxxxxx
这是我发现的一个解决方案-^(?!(xx+)\1+$)
(here,是对this问题的解答)。但是,我想知道它为什么起作用。请也分享其他替代解决方案。
我正在使用PCRE引擎。
我意识到人们通常不会将正则表达式用于这种事情。我只是对如何完成感到好奇。
答案 0 :(得分:3)
^(?!(xx+)\1+$)
通过在行的开头执行负前瞻进行工作。它将拒绝包含以下内容的任何行
x
es x
,可能是多次换句话说,正则表达式的工作原理是匹配任意数量的x
,这些{不能被分成多个相等大小的较小的大小相等的组,大小大于等于2。
要排除仅一个x
的情况,可以使用^(?!(xx+)\1+$|x$)
。
答案 1 :(得分:0)
我认为正则表达式不是正确的工具。为什么需要这样做?
如果您不能对字符串的长度做任何假设,则需要检查数字是否以某种方式是质数(这在计算上是昂贵的)。
如果知道最大长度,则可以预先计算素数,然后根据它们检查长度,但是使用regex进行此操作仍会不必要地复杂。
因此,我唯一知道的方法是使用\b(\d{2}|\d{3}|\d{5})\b
,正如您所知,它将很快变得很麻烦。