如何获得精确的正则表达式只接受带字母的数字?

时间:2016-10-21 09:17:07

标签: c# regex

您好,我试图获得匹配数字与字母表的精确正则表达式, 我试过这个

 Regex.IsMatch("1111", @"^[a-zA-Z0-9]+$")

但输出为真。

这是我想要的输出

12345678 -> False
abcdefgh -> False
ABCDEFGH -> False
1234abcd -> True
1234ABCD -> True

5 个答案:

答案 0 :(得分:2)

这将匹配任何包含数字和字母的字符串,无论顺序如何:

^[[:alnum:]]*(([0-9][A-Za-z])|([A-Za-z][0-9]))[[:alnum:]]*$

如果您希望可以将[[:alnum:]]替换为[A-Za-z0-9],则可能必须将其用于C#,请参阅此答案下的评论。

尝试一下:https://regex101.com/r/yj9sWw/2

答案 1 :(得分:1)

尝试以下正向前瞻匹配表达式:

^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$

这断言两个分组表达式都为真,并在匹配时返回完整字符串。

示例:https://regex101.com/r/GxPPt9/2

答案 2 :(得分:0)

我建议使用非正则表达式来计算字母数字和数字字符数:

bool ContainsOnlyDigitsAndLetters(string source)
{
    int letters = myInput.Count(Char.IsLetter);
    int numbers = myInput.Count(Char.IsDigit);
    return letters != 0 && numbers != 0 && letters + numbers == myInput.Length;
}

如果您的inout混淆,则返回true,如果它只包含数字或仅包含字母,或者字符串中的字符既不是一个也不是另一个字符,则返回false。

答案 3 :(得分:0)

你也可以写:

^(?>[0-9]+|[a-zA-Z]+)[a-zA-Z0-9]+$

demo

此处原子组(?>...)阻止正则表达式引擎回溯,因为量词+是贪婪的,与[a-zA-Z0-9]+匹配的下一个字符与在交替中匹配的字符不同。当分支[0-9]+成功时,由[a-zA-Z0-9]+匹配的第一个字符只能是一个字母,当[a-zA-Z]+成功时,由[a-zA-Z0-9]+匹配的第一个字符只能是一个数字。

答案 4 :(得分:-1)

更改

a-zA-Z0-9

\w+\d+

@"^[\w+\d+]+$"

编辑:

如果数字总是在字符之前如此简单:

(\d+\w+)