-4

如何编写正则表达式来查找任意长度的字符串,仅由 3 个不同的数字组成?

例如 3213213312, 679976679,与 56785678 不对应

4

3 回答 3

4

我同意正则表达式不是正确的工具,但有可能:

^(\d)\1*(?!\1)(\d)(?:\1|\2)*(?!\1|\2)(\d)(?:\1||\2|\3)*$

解释:

^                 # Start of string
(\d)              # Match the first digit
\1*               # possibly more than once
(?!\1)            # Now match (as long as it's not the same one)
(\d)              # another digit
(?:\1|\2)*        # and possibly more repetitions of the first two.
(?!\1|\2)         # Then match (as long as it's one like before)
(\d)              # a third digit.
(?:\1||\2|\3)*    # Now match any number of one of the three digits
$                 # until the end of the string.

更好的解决方案,例如在 Python 中:

def threedigits(string):
    return string.isdigit() and len(set(string))==3

这更具可读性(而且肯定更快)。

>>> threedigits("234")
True
>>> threedigits("234234")
True
>>> threedigits("2342345")
False
>>> threedigits("23232323")
False
于 2013-10-08T13:13:59.280 回答
3

正则表达式(如果必须的话):Tim Pietzcker的回答

更好的方法(PHP):

$letters = count(array_unique(str_split("21323132")));//3

更好的方法(JavaScript):

var ltrs = '32132121232'.split('');
var unique=[];
for(var i=0,c=ltrs.length;i<c;i++)
{
    if(unique.indexOf(ltrs[i])==-1)
    {
        unique.push(ltrs[i]);
    }
}
console.log(unique.length);//3

更好的是,我必须指出,我正在考虑灵活性、易读性和日后修改的能力。没有考虑性能测试或标准。

最终制作了一个通用的 JavaScript 解决方案:

function isxnums(str,x)
{
    x = x || 3;//Default number check to 3
    if(str.match(/^[0-9]+$/)==null) return false;
    for(var c=0,s2='';str!='';)
    {
        var num = str.match(/^([0-9])/)[1];
        s2 = str.replace(new RegExp(num,'g'),'');
        if(str != s2) c++;
        str = s2;
    }
    return c==x;
}

isxnums('123');//true
isxnums('3213213312');//true
isxnums('11111');//false
isxnums('11111',1);//true
于 2013-10-08T13:09:04.073 回答
1

我不知道您使用的是哪种语言,但这种方式可能会有所帮助:

  • 取字符串的第一个字符(数字)
  • 用空替换整个字符串中的字符

重复上述步骤 3 次,

  • 如果不能在 3 次内完成,返回 false
  • 之后,如果输入字符串仍然不为空,则返回 false。
  • 否则为真
于 2013-10-08T13:14:08.210 回答