我正在尝试验证我正在制作的表单的驾驶执照。 我试图使用一个正则表达式。
我是正则表达式的新手我正在谷歌搜索试图解决它。对此的帮助将不胜感激。
答案 0 :(得分:5)
它必须是一个正则表达式吗?通过将它们分开来保持简单:
static bool IsValid(string input)
{
return Regex.IsMatch(input, @"^[A-Za-z0-9]{4,9}$") // length and alphanumeric
&& Regex.IsMatch(input, "^..[0-9]{2}") // 3rd+4th are numeric
&& Regex.IsMatch(input, "(.*[0-9]){4}") // at least 4 numeric
&& !Regex.IsMatch(input, "(.*[A-Za-z]){3}"); // no more than 2 alpha
}
答案 1 :(得分:2)
尝试用一个正则表达式来解决这个问题可能有点困难,因为你需要跟踪多个事情。我建议你分别尝试验证每个属性(除非有意义,否则)。
例如,您可以通过检查包含所有字母数字字符的character class和quantifier来轻松验证第一个和第二个属性,该anchors表示它最多应出现9次:
^[0-9a-zA-Z]{4,9}$
anchor ^
和$
确保这实际上与整个字符串匹配,而不仅仅是它的一部分。正如Marc Gravell所指出的,字符串"aaaaa"
将匹配表达式"a{3}"
,因为它也可以部分匹配。
检查第五个属性可以类似地完成,虽然这次我们不关心其余的:
^..[0-9]{2}
此处^
字符是字符串开头的dot (.
),Marc Gravell是任意字符的占位符,我们正在检查第三个和第四个字符是否为再次使用字符类和重复量词进行数字化。
通过迭代字符串并保持计数器,可以最简单地验证属性3和4。
编辑: pipe (|
)对于具有正则表达式的两个案例也有一个非常好的解决方案。没想到那些。
如果你绝对需要在一个正则表达式中执行此操作,这将有点工作(可能既不快也不可读)。基本上我开始枚举所有可能的选项,如字符串可能看起来像。我在这里使用a
作为字母字符的占位符,并使用1
作为数字的占位符。
我们需要至少四个字符(3),第三个和第四个字符始终固定为数字。对于四个字符的字符串,这只留下一个选项:
1111
但是,五个字符的字符串可能会引入一个字母,但不同的位置:
a1111
1a111
1111a
和以前一样,全数字变体:
11111
继续这样你可以为每个案例创建特殊规则(基本上我将其分为“无字母”,“一个字母”和“两个字母”,并列举不同的模式。然后你可以串起来所有带有{{3}}字符的模式,在正则表达式中用作替代。
答案 2 :(得分:2)
这可能会让你开始......
val x = sc.parallelize(List((2, Map("a" -> 0.2, "b" -> 0.3))))
x.flatMap {
case (id, m) => m.map { case (k, v) => (id, k, v)}
}
.collect()
res1: Array[(Int, String, Double)] = Array((2,a,0.2), (2,b,0.3))
}