正则表达式 - Phone 数字(包括+,(,)和长度验证 - C#
Regular expression - Phone number ( including +, (,), and length validation - C#
最近我必须想出一个 phone 数字的正则表达式,因为许多开发人员已经这样做了,所以我找到了一个与之相关的解决方案。
并在生产中使用了相同的方法。
版本#1 仅包含数字:
@"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}"
但是还有一个额外的要求:我们需要允许像 -
和 (
)
这样的特殊字符
所以我将正则表达式修改为 Version#2 如下所述:
@"^([\+]?[0-9]{1}[0-9]{0,2})[\s-]?[\(]?(0?[0-9]\d{0,4}[\)]?[-\s]?)([0-9][\d-\s]{5,7}[\s]?)(x[\d-]{0,4})?$"
现在,在验证 phone 号码的长度时,QA 发现它接受超过 16 个字符,我必须再次处理正则表达式以使其工作。
这是我发现与使用正则表达式的 phone 数字验证长度相关的问题。
- 有什么方法可以通过修改正则表达式来指示 phone 数字应该接受最小长度为 10 和最大长度为 15 吗?
这里的示例可能是 123456789
- 想要将其标记为无效 phone 号码,因为它只有 9 位数字
此处的示例可能是 1234567890123456
- 想要将其标记为无效 phone 号码,因为它只有 16 位
- 有什么方法可以通过修改正则表达式来表示单左括号和单右括号在phone数字中无效?
这里的示例可能是 12(34567890
- 想要将其标记为无效 phone 号码,因为它只有 左括号
目前,我通过向 phone 数字字段添加自定义属性来实现上述目标。我真的很想知道,是否有办法通过修改正则表达式本身来实现上述目标?
您可以使用正则表达式,并在开头锚定 (?=(?:\D*\d){10,15}\D*$)
正前瞻:
^(?=(?:\D*\d){10,15}\D*$)\+?[0-9]{1,3}[\s-]?(?:\(0?[0-9]{1,5}\)|[0-9]{1,5})[-\s]?[0-9][\d\s-]{5,7}\s?(?:x[\d-]{0,4})?$
参见regex demo。
详情:
^
- 字符串开头
(?=(?:\D*\d){10,15}\D*$)
- 确保有 10 到 15 个非数字序列后跟 1 个数字,然后有 0+ 个数字直到字符串末尾的正向前瞻
\+?
- 一个可选的 +
符号
[0-9]{1,3}
- 1 到 3 位数
[\s-]?
- 可选空格或 -
(?:\(0?[0-9]{1,5}\)|[0-9]{1,5})
- 两种选择之一:
\(0?[0-9]{1,5}\)
- 一个(
, 1到5位, )
|
- 或
[0-9]{1,5}
- 1 到 5 位数
[-\s]?
- 一个可选的空格或 -
[0-9]
- 一个数字
[\d\s-]{5,7}
- 5 到 7 位数字、空格或 -
\s?
- 一个可选的空格
(?:x[\d-]{0,4})?
- 一个可选的序列:
x
- 文字 x
[\d-]{0,4}
- -
的0到4位
$
- 字符串结尾。
最近我必须想出一个 phone 数字的正则表达式,因为许多开发人员已经这样做了,所以我找到了一个与之相关的解决方案。 并在生产中使用了相同的方法。
版本#1 仅包含数字:
@"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}"
但是还有一个额外的要求:我们需要允许像 -
和 (
)
这样的特殊字符
所以我将正则表达式修改为 Version#2 如下所述:
@"^([\+]?[0-9]{1}[0-9]{0,2})[\s-]?[\(]?(0?[0-9]\d{0,4}[\)]?[-\s]?)([0-9][\d-\s]{5,7}[\s]?)(x[\d-]{0,4})?$"
现在,在验证 phone 号码的长度时,QA 发现它接受超过 16 个字符,我必须再次处理正则表达式以使其工作。
这是我发现与使用正则表达式的 phone 数字验证长度相关的问题。
- 有什么方法可以通过修改正则表达式来指示 phone 数字应该接受最小长度为 10 和最大长度为 15 吗?
这里的示例可能是 123456789
- 想要将其标记为无效 phone 号码,因为它只有 9 位数字
此处的示例可能是 1234567890123456
- 想要将其标记为无效 phone 号码,因为它只有 16 位
- 有什么方法可以通过修改正则表达式来表示单左括号和单右括号在phone数字中无效?
这里的示例可能是 12(34567890
- 想要将其标记为无效 phone 号码,因为它只有 左括号
目前,我通过向 phone 数字字段添加自定义属性来实现上述目标。我真的很想知道,是否有办法通过修改正则表达式本身来实现上述目标?
您可以使用正则表达式,并在开头锚定 (?=(?:\D*\d){10,15}\D*$)
正前瞻:
^(?=(?:\D*\d){10,15}\D*$)\+?[0-9]{1,3}[\s-]?(?:\(0?[0-9]{1,5}\)|[0-9]{1,5})[-\s]?[0-9][\d\s-]{5,7}\s?(?:x[\d-]{0,4})?$
参见regex demo。
详情:
^
- 字符串开头(?=(?:\D*\d){10,15}\D*$)
- 确保有 10 到 15 个非数字序列后跟 1 个数字,然后有 0+ 个数字直到字符串末尾的正向前瞻\+?
- 一个可选的+
符号[0-9]{1,3}
- 1 到 3 位数[\s-]?
- 可选空格或-
(?:\(0?[0-9]{1,5}\)|[0-9]{1,5})
- 两种选择之一:\(0?[0-9]{1,5}\)
- 一个(
, 1到5位,)
|
- 或[0-9]{1,5}
- 1 到 5 位数
[-\s]?
- 一个可选的空格或-
[0-9]
- 一个数字[\d\s-]{5,7}
- 5 到 7 位数字、空格或-
\s?
- 一个可选的空格(?:x[\d-]{0,4})?
- 一个可选的序列:x
- 文字x
[\d-]{0,4}
--
的0到4位
$
- 字符串结尾。