phone 数字的正则表达式 - 如何确保用户不会输入 +-*+-*+-*+-*?

Regex of phone number - how to make sure the user won't put +-*+-*+-*+-*?

我想允许用户仅输入如下模式:

+9720545455454

056565656345

03-43434344

0546-4234234

*9090

+97203-0656534

意思是,我不想让用户把所有东西都乱七八糟,比如:

+954-4343+3232*4343+-

+-4343-+5454+9323+234

我该如何修复这个模式

public static bool IsPhoneNumberCorrect(string phoneNumber)
{
    return Regex.IsMatch(phoneNumber, @"^[0-9*+-]+$");
}

为此目的?

如果你不关心数字组的长度,你可以只在开头允许+*,然后匹配初始数字,然后是可选的连字符+数字组:

return Regex.IsMatch(phoneNumber, @"^[+*]?\d+(?:-\d+)*$");

demo

请注意,您可以使用量词限制连字符+数字的数量。比如说,可以有 none 或 1:

^[+*]?\d+(?:-\d+)?$"
                 ^

another demo

如果超过 1 个,请使用限制量词:

^[+*]?\d+(?:-\d+){0,3}$"
                 ^^^^^

此处,{0,3}表示连字符+数字组重复0、1、2或3次。

^(?!(.*\+){2})(?!(.*-){2})(?!(.*\*){2})[0-9*+-]+$

您可以使用 lookaheads 来确保 special characters 仅出现 once。查看演示。

https://regex101.com/r/vV1wW6/1

您首先需要做的是确定模式到底是什么。这不需要在代码中。在您的示例中,我看到一个前导字符,后跟第一个数字组,然后是一个可选的破折号和第二个数字组。前导字符可以是 +、* 或 0。数字组是 1 到 9 之间的一位数字,后跟一位或多位 0 到 9 的数字。翻译每个元素给出:

组长:[+*0]

破折号:-

号码组:[1-9][0-9]+

将所有东西放在一起得到

[\+\*0][1-9][0-9]+(-[1-9][0-9]+)?

有些组可能有最小和最大长度,您仍然可以将 + 更改为 {min, max}。