我需要一个正则表达式,允许用户输入数字,加号,减号和圆括号

时间:2011-12-24 18:00:36

标签: c# regex

我需要一个正则表达式,允许用户输入数字,加号,减号和圆括号。

用户只能输入:

  • 最多一个左括号'('。
  • 最多一个近括号')'。
  • 最多一加'+'
  • 尽可能多的减去' - '而不是彼此相继。
  • 正好是11个数字。

以下是有效输入:

(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(无效。

提前致谢

2 个答案:

答案 0 :(得分:2)

我认为正则表达式不是你最好的选择,因为它可能变得太复杂而且容易被打破。

我建议您尝试解析您的输入,即计算用户输入的数字,缩写,加号和括号的数量,以及它们是否以正确的顺序出现。一个简单的方法是循环组成字符串的字符并检查当前的char:

  • 是一个数字(我们会记录我们找到的数量)
  • 是减号(前一个字符不是减号)
  • 是一个加号(它是第一个)
  • 是一个括号(它是第一个左括号它是一个封闭的括号,我们已经找到了左括号)

这可以解决问题。

答案 1 :(得分:2)

这个正则表达式通过了你的例子,但可能不是你想要的。它应该指向正确的方向。

^(?!.*-{2,})(?!(?:.*\)){2,})(?!(?:.*\(){2,})(?!\+{2,})(?:\D*\d\D*){11}$
  • (?!。* - {2,})不能包含两个或多个连字符。
  • (?!(?:。*)){2,})不能包含两个或多个右括号。
  • (?!(?:。*(){2,})不能包含两个或多个左括号。
  • (?!+ {2,})不能以两个以上的加法符号开头。
  • (?:\ D * \ d \ D *){11}必须包含由任何内容包围的11个数字字符实例。

然而,这非常令人困惑且相当低效。我敢打赌,可以更快地重写正则表达式,但不会更容易理解。

我建议您遵循MisterJack的建议而不是追求正则表达式。维护起来会更容易。

修改


^(?!.*--)(?!.*(\(|\)|\+).*\1)(?:\D*\d\D*){11}$

我已使用反向引用将括号和加号符号规则合并为一个负前瞻。这也将parens和pluses的数量限制为每个中的一个。我无法限制它只限于某一组字符,但你可以在第二次使用另一个正则表达式时这样做。

  • ^从字符串的开头匹配
  • (?!。* - )不允许连续连字符
  • (?!。*((|)| +)。* \ 1)不允许()或+
  • 的两个或多个实例
  • (?:\ D * \ d \ D *){11}必须包含11位数字,允许前后的非数字字符,例如连字符。
  • $匹配到字符串结尾

我尝试了一个消极和积极的前瞻来限制角色,但却无法让它正常工作。我也尝试用[()+ - ]替换\ D,但这也不起作用。也许其他人会添加评论以显示如何限制字符。我很乐意看到其他人在这个正则表达式中做到了这一点。