Skip to main content
 首页 » 编程设计

c#之我需要一个允许用户输入数字、加号、减号和括号的正则表达式

2024年02月23日29bjzhanghao

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

用户只能输入:

  • 最多一个左括号'('。
  • 最多一个右括号')'。
  • 最多加一个“+”
  • 尽可能多的减号“-”,但不是一个接一个。
  • 恰好 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,})(?!(?:.*\)){2,})(?!(?:.*\(){2,})(?!\+{2,})(?:\D*\d\D*){11}$ 
  • (?!.*-{2,}) 不能包含两个或多个连字符。
  • (?!(?:.*)){2,}) 不能包含两个或多个右括号。
  • (?!(?:.*(){2,}) 不能包含两个或多个左括号。
  • (?!+{2,}) 不能以两个以上的加号开头。
  • (?:\D*\d\D*){11} 必须包含 11 个被任何内容包围的数字字符实例。

但是,这非常困惑并且效率很低。我打赌正则表达式可以重写得更快,但不会更容易理解。

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

编辑


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

我已经使用反向引用将括号和加号规则合并为一个负先行。这也将括号和加号的数量限制为每个只有一个。我无法将其限制为仅一组特定的字符,但您可以在第二遍中使用另一个正则表达式来做到这一点。

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

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