我尝试过一个正则表达式,可以接受任意顺序的3位数,希望它有效。 这是我的示例代码:
^(?:\D*\d){3}\D*$
它接受这样的字符串:abc123,a2v1c3,123agc
我现在的问题是当我合并接受至少3个字母和3个数字的代码时。我已经尝试了许多正则表达式的组合但是我未能实现正确的正则表达式。有谁知道如何编写正确的正则表达式,任何顺序接受至少3个字母和3个数字?提前谢谢。
答案 0 :(得分:3)
您可以使用组合前瞻来确保每个类中至少有三个满足而不消耗。然后,使用具有限制的所有有效字符。
/(?=.*[a-z].*[a-z].*[a-z].*)(?=.*\d.*\d.*\d.*)[a-z0-9]{6,}/
这很难看,但它比我想出的唯一替代方案更漂亮;
/\d{3}[a-z]{3}|\d{2}[a-z]{3}\d|\d{1}[a-z]{3},\d{2} ...
答案 1 :(得分:1)
这应该有效
"^[A-Za-z]*(?:\d[A-Za-z]*){3,3}$"
测试:
List<string> tests = new List<string>
{
"abc123",
"123agc",
"1a3a2c",
"a2v1c3"
};
if (tests.All(s => Regex.Match(s, @"^[A-Za-z]*(?:\d[A-Za-z]*){3,3}$").Success))
{
MessageBox.Show(":)");
}
答案 2 :(得分:0)
我认为对于类似的东西,你需要有一些计数功能,如果我没记错的话,不是由正则表达式引擎提供(除了通常的{{1}运营商)。
你可以做的是拥有2个正则表达式,一个用于字母,一个用于数字(大多数编程语言提供{min, max}
和isDigit
功能,所以你也可以使用它们并拥有一些一种反击。执行此操作而不是正则表达式将产生更清晰,更易于维护和理解的代码。
答案 3 :(得分:0)
你可以通过两个积极的前瞻来做到这一点:
/(?=(?:.*\d){3})(?=(?:.*[a-z]){3})^[a-z\d]*$/
寻找至少3位数:
(?=(?:.*\d){3})
寻找至少3个字母:
(?=(?:.*[a-z]){3})
定义开始和结束之间允许的内容:
^[a-z\d]*$/