我需要一个允许用户输入数字、加号、减号和括号的正则表达式。
用户只能输入:
- 最多一个左括号'('。
- 最多一个右括号')'。
- 最多加一个“+”
- 尽可能多的减号“-”,但不是一个接一个。
- 恰好 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 但这也不起作用。也许其他人会添加评论以显示如何限制字符。我很想看看其他人是如何用这个正则表达式来做到这一点的。
