Я ищу создать шаблон 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
3
Eslam Totti 16 Мар 2014 в 15:00

2 ответа

Лучший ответ

Вы могли бы вместо этого использовать:

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

Первая часть утверждает, что совпадение содержит 8 алфавитов или цифр. Как только это будет обеспечено, вторая часть гарантирует, что в совпадении будет только одна цифра.

РЕДАКТИРОВАТЬ: Объяснение:

  • Якоря ^ и $ обозначают начало и конец строки.
  • (?=[0-9a-zA-Z]{8}) утверждает, что совпадение содержит 8 алфавитов или цифр.
  • [^\d]*\d[^\d]* будет означать, что есть только один цифровой символ, а остальные нецифровые символы. Поскольку мы уже утверждали, что входные данные содержат цифры или алфавиты, нецифровые символы здесь являются алфавитами.
8
devnull 16 Мар 2014 в 15:58
Я не понимаю вторую часть, можешь объяснить?
 – 
Eslam Totti
16 Мар 2014 в 15:54

Если вам нужно решение без регулярных выражений, я написал это для небольшого проекта:

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;
}
0
aloisdg 16 Мар 2014 в 15:40