RegEx for UK区号。

时间:2011-09-26 22:19:42

标签: regex

我需要能够在输入时验证英国电话号码,并在显示时以正确的格式显示它们。

我已经看过几个不可思议的RegEx示例,但它们没有为所有英国号码获得正确的格式或拒绝某些有效格式(或允许一些无效格式)。

我找到了所需格式的列表,它看起来正确(并且比我最初想象的要复杂得多)但是如何将其转换为“简单”的RegEx模式?

NSN长度:

  • 10岁;
  • 对于某些01xxx区域,
  • 9;
  • 9 for all 0500,some 0800;
  • 7表示两个特殊的08xx号码。

格式:

NSN = 10:

  • (01xxxx)xxxxx
  • (01xxx)xxxxxx
  • (01x1)xxx xxxx
  • (011x)xxx xxxx
  • (02x)xxxx xxxx
  • 03xx xxx xxxx
  • 055 xxxx xxxx
  • 056 xxxx xxxx
  • 070 xxxx xxxx
  • 07xxx xxxxxx
  • 0800 xxx xxxx
  • 08xx xxx xxxx
  • 09xx xxx xxxx

NSN = 9:

  • (016977)xxxx
  • (01xxx)xxxxx
  • 0500 xxxxxx
  • 0800 xxxxxx

NSN = 7:

  • 0800 1111
  • 0845 46 47

注意:

  • 01范围可以使NSN为10或9。
  • 0800范围可以使NSN为10,9或7。
  • 0845范围可以使NSN为10或7。

2 个答案:

答案 0 :(得分:0)

最简单(尽管不是最优雅)的解决方案是简单地将列表与|连接运营商,例如:

\(01\d\{4}\) \d{5}|\(01\d{3}) \d{6}|(01\d1) \d{3} \d{4}|0800 1111

关于这一点的好处是,如果你从列表中编写一个简短的转换脚本,你必须使用正则表达式,那么如果将来获得一个新列表,你可以重新生成正则表达式,而无需进行复杂的调试。 / p>

虽然您可以通过分解常见的子表达式来优化这一点,但只有在您发现性能有问题时才会这样做。在现代机器上使用合适的RE引擎不太可能。

答案 1 :(得分:0)

获取有效模式列表并执行以下步骤:

  • ^放在该行的开头,将$放在该行的末尾。
  • 在每个括号前加上反斜杠。
  • 将{xxxx替换为[0-9]{n},其中n是位数。
  • 使用|加入每一行。

您可以手动执行这些步骤,也可以编写程序来执行这些步骤并为您生成正则表达式。

例如,如果你有这些模式:

  • (01xxxx)xxxxx
  • (01xxx)xxxxxx
  • (01x1)xxx xxxx

那么正则表达式就是这样:

^\(01[0-9]{4}\) [0-9]{5}$|^\(01[0-9]{3}\) [0-9]{6}$|^\(01[0-9]1\) [0-9]{3} [0-9]{4}$

您可能还希望通过在其后面添加问号来使空格可选。