向前看和向后看最多一个数字
本文关键字:一个 数字 向前看 | 更新日期: 2023-09-27 17:50:24
我正在寻找创建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;
}