Regex Lookahead,最多只能看一位数

时间:2014-03-16 11:00:42

标签: c# .net regex regex-lookarounds

我正在寻找创建RegEx模式

  • 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 个答案:

答案 0 :(得分:8)

您可以改为使用:

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

第一部分断言该匹配包含8个字母或数字。一旦确保这一点,第二部分确保匹配中只有一个数字。

编辑:说明:

  • 主播^$表示字符串的开头和结尾。
  • (?=[0-9a-zA-Z]{8})断言该匹配包含8个字母或数字。
  • [^\d]*\d[^\d]*意味着只有一个数字字符和剩余的非数字字符。由于我们已经断言输入包含数字或字母,因此这里的非数字字符是字母。

答案 1 :(得分: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;
}