正则表达式Lookahead,最多只能看一位数

我正在寻找创建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 

你可以改为使用:

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

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

编辑:说明:

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

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

 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; }