你还没有说你用什么语言做这个,所以我们不知道你的正则表达式解析器有什么样的限制。例如,传统sed
仅限于 BRE,awk 和 grep 可以处理 ERE,而 linux 系统上的 grep 将处理 PCRE。Perl 当然也会做 PCRE,Python 和 PHP 也一样。但是 JavaScript 只支持 BRE 的一个子集,并且遗漏了一些 POSIX 类的经典快捷方式。
所以......要在 BRE 中做到这一点,一切都支持,你的括号是字面意思的,你有有限的范围控制:
^([[:digit:]]\{3\})[[:space:]]\{0,1\}[[:digit:]]\{3\}-[[:digit:]]\{4\}$
但这是艰巨而痛苦的。您可能正在使用至少支持 ERE 的东西:
^\([[:digit:]]{3}\)[[:space:]]?[[:digit:]]{3}-[[:digit:]]{4}$
如果你的解析器支持类速记,你可以进一步缩短它:
^\(\d{3}\)\s?\d{3}-\d{4}
最后一个可以与 perl 或 PHP 的 PCRE 支持一起使用,但不能与 sed、awk 或 grep 一起使用。
另外,我要指出,这不是处理输入验证的好方法。你想要更多的灵活性。例如,这将是一个更好的主意,
- 去掉所有非数字字符
- 如果结果是 10 位,请检查有效的区号
- 如果结果为 11 位且第一位为 1,则检查有效的区号
- 否则,将其视为国际号码
您可能还需要提出其他一些条件。