我需要一个正则表达式,允许用户输入数字,加号,减号和圆括号。
用户只能输入:
以下是有效输入:
(0)+12-3-4-56-7890
+)0(12345-678-90
+01234567890
+(01234567890)
01234567890
-01-234+5678-90
(01234567890)
)01234567890(
以下无效:
0123456--7890
0((1234567890
01234567890))
++01234567890
123456
++123456789
我正在使用C#进行编程,如果它有助于打开和关闭括号的顺序也可以成为强制性的。因此)01234567890(
无效。
提前致谢
答案 0 :(得分:2)
我认为正则表达式不是你最好的选择,因为它可能变得太复杂而且容易被打破。
我建议您尝试解析您的输入,即计算用户输入的数字,缩写,加号和括号的数量,以及它们是否以正确的顺序出现。一个简单的方法是循环组成字符串的字符并检查当前的char:
这可以解决问题。
答案 1 :(得分:2)
这个正则表达式通过了你的例子,但可能不是你想要的。它应该指向正确的方向。
^(?!.*-{2,})(?!(?:.*\)){2,})(?!(?:.*\(){2,})(?!\+{2,})(?:\D*\d\D*){11}$
然而,这非常令人困惑且相当低效。我敢打赌,可以更快地重写正则表达式,但不会更容易理解。
我建议您遵循MisterJack的建议而不是追求正则表达式。维护起来会更容易。
修改强>
^(?!.*--)(?!.*(\(|\)|\+).*\1)(?:\D*\d\D*){11}$
我已使用反向引用将括号和加号符号规则合并为一个负前瞻。这也将parens和pluses的数量限制为每个中的一个。我无法限制它只限于某一组字符,但你可以在第二次使用另一个正则表达式时这样做。
我尝试了一个消极和积极的前瞻来限制角色,但却无法让它正常工作。我也尝试用[()+ - ]替换\ D,但这也不起作用。也许其他人会添加评论以显示如何限制字符。我很乐意看到其他人在这个正则表达式中做到了这一点。