正则表达式中最多有一个数字的向前查找和向后查找

3

我希望你能够创建一个正则表达式模式。

  • 8个字符[a-zA-Z]
  • 字符串中只能包含一个数字

我创建了以下模式:

^(?=.*[0-9].*[0-9])[0-9a-zA-Z]{8}$

这个模式可以正常工作,但我希望只允许一个数字。 例如:

aaaaaaa6   match
aaa7aaaa   match

aaa88aaa   don't match
aaa884aa   don't match
aaawwaaa   don't match
2个回答

8
您可以使用以下方法代替:

您可以使用以下方法:

^(?=[0-9a-zA-Z]{8})[^\d]*\d[^\d]*$

第一部分会断言匹配包含8个字母或数字。一旦这个被确认,第二部分会确保匹配中只有一个数字。
编辑:解释:
- 锚点 ^ 和 $ 表示字符串的开头和结尾。 - (?=[0-9a-zA-Z]{8}) 断言匹配包含8个字母或数字。 - [^\d]*\d[^\d]* 意味着只有一个数字字符和剩余的非数字字符。由于我们已经断言了输入包含数字或字母,所以这里的非数字字符是字母。

我不理解第二部分,你能解释一下吗? - Eslam Totti

0

如果你想要一个非正则表达式的解决方案,我为一个小项目编写了这个:

public static bool ContainsOneDigit(string s)
{
    if (String.IsNullOrWhiteSpace(s) || s.Length != 8)
        return false;
    int nb = 0;
    foreach (char c in s)
    {
        if (!Char.IsLetterOrDigit(c))
            return false;
        if (c >= '0' && c <= '9') // just thought, I could use Char.IsDigit() here ...
            nb++;
    }
    return nb == 1;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接