PCRE(php)是否可以检查数字序列是否仅包含该序列的唯一编号?

时间:2014-12-16 18:52:30

标签: php regex

假设我有一组数字(从1到22)除以一些琐碎的分隔符(逗号,点,空格等)。我需要确保这组数字不包含任何相同数字的重复。例子:

1,14,22,3 // good
1,12,12,3 // not good

是否可以通过正则表达式进行?

我知道使用php很容易做到,但我真的很想知道如何使用正则表达式。

3 个答案:

答案 0 :(得分:2)

是的,你可以通过负面的looahead通过正则表达式实现这一点。

^(?!.*\b(\d+)\b.*\b\1\b)\d+(?:,\d+)+$
  • (?!.*\b(\d+)\b.*\b\1\b)在开始时的否定前瞻声明,匹配中不存在重复的数字。 \b(\d+)\b.*\b\1\b匹配重复的数字。

  • \d+匹配一个或多个数字。

  • (?:,\d+)+ ,,一个或多个数字的一​​次或多次出现。

  • $断言我们到底。

DEMO

正则表达式用空格,点,逗号作为分隔符分隔的数字。

^(?!.*\b(\d+)\b.*\b\1\b)\d+(?:([.\s,])\d+)(?:\2\d+)*$

(?:([.\s,])\d+)捕获此非捕获组内的组有助于我们检查以下分隔符是否属于同一类型。即,上述正则表达式不匹配像2,3 5.6

这样的字符串

DEMO

答案 1 :(得分:0)

您可以使用此正则表达式:

^(?!.*?(\b\d+)\W+\1\b)\d+(\W+\d+)*$
  • 否定前瞻 (?!.*?(\b\d+)\W+\1\b)避免匹配,当2个相似的数字一个接一个地出现时,由1个或多个非单词字符分隔。

RegEx Demo

答案 2 :(得分:0)

这是符合我当前需求的解决方案:

^(?>(?!\2\b|\3\b)(1\d{1}|2[0-2]{1}|\d{1}+)[,.; ]+)(?>(?!\1\b|\3\b)(1\d{1}|2[0-2]{1}|\d{1}+)[,.; ]+)(?>(?!\1\b|\2\b)(1\d{1}|2[0-2]{1}|\d{1}+))$

它返回具有唯一数字除以一个或多个分隔符的所有序列,并且还将数字本身从1限制为22,从而仅允许序列中的3个数字。

请参阅working example

然而,它并不完美,但工作正常!非常感谢为我提供帮助的每个人!