我一直在努力寻找合适的解决方案: -
我需要一个匹配所有英国电话号码和手机的正则表达式。
到目前为止,这个似乎涵盖了大部分英国数字:
^0\d{2,4}[ -]{1}[\d]{3}[\d -]{1}[\d -]{1}[\d]{1,4}$
但是,移动电话号码不适用于此正则表达式或电话号码,这些电话号码写在一个固体模块中,例如01234567890。
有人可以帮我创建所需的正则表达式吗?
答案 0 :(得分:3)
鉴于人们有时会在随机位置用空格写下他们的数字,你可能最好不要同时忽略这些空格 - 你可以使用像这样简单的正则表达式:
^ 0(\ d?){10} $
匹配:
但它也会匹配:
所以你可能不喜欢它,但它肯定更简单。
答案 1 :(得分:2)
删除所有空格和非数字字符,然后进行测试。它会比试图考虑括号,空格等所有可能的选项更容易。 请尝试以下方法:
@"^(([0]{1})|([\+][4]{2}))([1]|[2]|[3]|[7]){1}\d{8,9}$"
以0
或+44
(国际)开头 - 我确定如果您愿意,可以添加0044
。
然后它有一个1
,2
,3
或7
然后它有8位或9位数。
如果您想更聪明,以下内容可能是一个有用的参考:http://en.wikipedia.org/wiki/Telephone_numbers_in_the_United_Kingdom
答案 2 :(得分:2)
这个正则表达式会这样做吗?
// using System.Text.RegularExpressions;
/// <summary>
/// Regular expression built for C# on: Wed, Sep 8, 2010, 06:38:28
/// Using Expresso Version: 3.0.2766, http://www.ultrapico.com
///
/// A description of the regular expression:
///
/// [1]: A numbered capture group. [\+44], zero or one repetitions
/// \+44
/// Literal +
/// 44
/// [2]: A numbered capture group. [\s+], zero or one repetitions
/// Whitespace, one or more repetitions
/// [3]: A numbered capture group. [\(?]
/// Literal (, zero or one repetitions
/// [area_code]: A named capture group. [(\d{1,5}|\d{4}\s+?\d{1,2})]
/// [4]: A numbered capture group. [\d{1,5}|\d{4}\s+?\d{1,2}]
/// Select from 2 alternatives
/// Any digit, between 1 and 5 repetitions
/// \d{4}\s+?\d{1,2}
/// Any digit, exactly 4 repetitions
/// Whitespace, one or more repetitions, as few as possible
/// Any digit, between 1 and 2 repetitions
/// [5]: A numbered capture group. [\)?]
/// Literal ), zero or one repetitions
/// [6]: A numbered capture group. [\s+|-], zero or one repetitions
/// Select from 2 alternatives
/// Whitespace, one or more repetitions
/// -
/// [tel_no]: A named capture group. [(\d{1,4}(\s+|-)?\d{1,4}|(\d{6}))]
/// [7]: A numbered capture group. [\d{1,4}(\s+|-)?\d{1,4}|(\d{6})]
/// Select from 2 alternatives
/// \d{1,4}(\s+|-)?\d{1,4}
/// Any digit, between 1 and 4 repetitions
/// [8]: A numbered capture group. [\s+|-], zero or one repetitions
/// Select from 2 alternatives
/// Whitespace, one or more repetitions
/// -
/// Any digit, between 1 and 4 repetitions
/// [9]: A numbered capture group. [\d{6}]
/// Any digit, exactly 6 repetitions
///
///
/// </summary>
public Regex MyRegex = new Regex(
"(\\+44)?\r\n(\\s+)?\r\n(\\(?)\r\n(?<area_code>(\\d{1,5}|\\d{4}\\s+"+
"?\\d{1,2}))(\\)?)\r\n(\\s+|-)?\r\n(?<tel_no>\r\n(\\d{1,4}\r\n(\\s+|-"+
")?\\d{1,4}\r\n|(\\d{6})\r\n))",
RegexOptions.IgnoreCase
| RegexOptions.Singleline
| RegexOptions.ExplicitCapture
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
//// Replace the matched text in the InputText using the replacement pattern
// string result = MyRegex.Replace(InputText,MyRegexReplace);
//// Split the InputText wherever the regex matches
// string[] results = MyRegex.Split(InputText);
//// Capture the first Match, if any, in the InputText
// Match m = MyRegex.Match(InputText);
//// Capture all Matches in the InputText
// MatchCollection ms = MyRegex.Matches(InputText);
//// Test to see if there is a match in the InputText
// bool IsMatch = MyRegex.IsMatch(InputText);
//// Get the names of all the named and numbered capture groups
// string[] GroupNames = MyRegex.GetGroupNames();
//// Get the numbers of all the named and numbered capture groups
// int[] GroupNumbers = MyRegex.GetGroupNumbers();
注意空格和破折号是如何可选的并且可以是它的一部分。现在它也被分成两个名为area_code
和tel_no
的捕获组,以便将其分解并更容易提取。< / p>
答案 3 :(得分:0)
这不是一个正则表达式,但是来自Braemoor Software的示例代码很容易理解并且非常彻底。
JS版本可能是最容易阅读的。它删除空格和连字符(我意识到你说你不能这样做)然后应用一些正面和负面的正则表达式检查。
答案 4 :(得分:0)
首先剥离非数字,除了+作为第一个字符。
(JavaScript)的
var tel=document.getElementById("tel").value;
tel.substr(0,1).replace(/[^+0-9]/g,'')+tel.substr(1).replace(/[^0-9]/g,'')
以下正则表达式允许在国际指标+之后,包含7到15位数之间的任意组合(ITU最大值),除非代码为+44(英国)。否则,如果字符串以+44,+ 440或0开头,则后跟2或7,然后是任意数字的9,或者后跟1,然后是除0以外的任何数字,然后是任意数字的七或八数字。 (因此0203有效,0703有效但0103无效)。目前没有025(或伦敦0205)这样的代码,但有一天可能会被分配。
/(^\+(?!44)[0-9]{7,15}$)|(^(\+440?|0)(([27][0-9]{9}$)|(1[1-9][0-9]{7,8}$)))/
其主要目的是为非公司号码识别正确的起始数字,然后是正确的数字位数。如果订户的本地号码是5,6,7或8位,则不会推断出它。它没有强制禁止最初的&#39; 1&#39;或者&#39; 0&#39; 0在订户号码中,我无法找到关于这些旧规则是否仍然执行的任何信息。来自英国境外的格式正确的国际电话号码不会强制实施英国电话规则。