2015-09-04 94 views
1

我搜索了整个谷歌找到一些方法来验证电话号码是罗马尼亚语,但没有发现任何可以帮助我... 我想要一个正则表达式验证程序以下数字格式:正则表达式匹配所有罗马尼亚电话号码

074xxxxxxx 
075xxxxxxx 
076xxxxxxx 
078xxxxxxx 
072xxxxxxx 
077xxxxxxx 
0251xxxxxx 
0351xxxxxx 

这就是我所做的正则表达式,但它不工作:

{ "Romania", new Regex("(/^(?:(?:(?:00\\s?|\\+)40\\s?|0)(?:7\\d{2}\\s?\\d{3}\\s?\\d{3}|(21|31)\\d{1}\\s?\\d{3}\\s?\\d{3}|((2|3)[3-7]\\d{1})\\s?\\d$)")} 

它不验证正确的数字格式。

更多细节:

  • 如果数量比,我已经添加了初始以外的其他的开始,那么这个数字是无效的。

  • 的x应包含任意数量的,但不应该是相同的number..like 0000000 1111111等

  • 它也可以具有以下格式(但不是强制性的):(072)XXXXXXX

有没有办法做到这一点?

我想实现这个在数据库中存储这些数字,并检查它们的格式是罗马尼亚语。 这是我需要添加的正则表达式表达式的代码...应该有一个名为“罗马尼亚”新正则表达式

static IDictionary<string, Regex> countryRegex = new Dictionary<string, Regex>() 
{ 
    { "USA", new Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")}, 
    { "UK", new Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")}, 
    { "Netherlands", new Regex("(^\\+[0-9]{2}|^\\+[0-9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-\\s]{10}$)")}, 
}; 
+2

你的定义不够清晰的。你提供的硬编码前缀是否需要明确匹配?你允许某些特殊字符吗?你是否试图提取数字,以便将这些数字存储在数据库中? –

+0

对不起,我更新了描述。如果我可以让'()'和' - '分开数字,那将会很好。 – Valip

+1

为什么使用正则表达式?你可以手动检查字符串并节省所有的痛苦。正则表达式并不总是最好的解决方案。 –

回答

2

如果我理解正确的规则,这种模式应该工作:

^(?<paren>\()?0(?:(?:72|74|75|76|77|78)(?(paren)\))(?<first>\d)(?!\k<first>{6})\d{6}|(?:251|351)(?(paren)\))(?<first>\d)(?!\k<first>{5})\d{5})$ 

所以,你可以把它添加到你的代码是这样的:

static IDictionary<string, Regex> countryRegex = new Dictionary<string, Regex>() 
{ 
    { "USA", new Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")}, 
    { "UK", new Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")}, 
    { "Netherlands", new Regex("(^\\+[0-9]{2}|^\\+[0-9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-\\s]{10}$)")}, 
    { "Romania", new RegEx(@"^(?<paren>\()?0(?:(?:72|74|75|76|77|78)(?(paren)\))(?<first>\d)(?!\k<first>{6})\d{6}|(?:251|351)(?(paren)\))(?<first>\d)(?!\k<first>{5})\d{5})$")} 
}; 

下面是模式的含义是:

  • ^ - 比赛必须开始在输入字符串的开头
  • (?<paren>\()? - 可选匹配的(字符。如果它是存在的,它捕获它命名paren
  • 0组中 - 的数量必须与单个0
  • (?:开始 - 开始一个非捕获组匹配的两种不同格式
  • 一个的目的(?:72|74|75|76|77|78)(?(paren)\))(?<first>\d)(?!\k<first>{6})\d{6} - 第一种格式
    • (?:72|74|75|76|77|78) - 接下来的两个数字必须是7274757677,或78
    • (?(paren)\)) - 如果开口(存在,那么必须有一个关闭)这里
    • (?<first>\d) - 只匹配第一的结束七位数字并捕获它命名first
    • (?!\k<first>{6})组 - 负外观-ahead其确保剩余六位是不相同的第一个
    • \d{6} - 匹配的剩余六位数字
  • | - 该操作
  • (?:251|351)(?(paren)\))(?<first>\d)(?!\k<first>{5})\d{5} - 第二种格式
    • (?:251|351) - 接下来的三个数字必须251351
    • (?(paren)\)) - 如果开口(存在,那么必须有一个封闭)这里
    • (?<first>\d) - 只匹配第一的结束六位数字,并捕获它命名first
    • (?!\k<first>{5})在组中 - 负look-提前确保剩余5位是不一样的第一个
    • \d{5} - 匹配的其余五个数字
  • ) - 结束其指定的两个潜在的格式
  • $非捕获组 - 本场比赛必须全力以赴的方式向输入字符串
+1

这完美的作品!感谢您提供更多信息,现在如果需要其他条件,我可以更新此表达式 – Valip

-1

这场比赛你的例子:

0(([7][456728])|([23]51)).* 
+1

这并不检查长度是否正确,也不检查“不应该有相同的数字,如0000000 1111111等。” – DBedrenko

+0

@NewWorld当我发布答案,它符合需要...:/ –

0

试试这个:^(?=0[723][2-8]\d{7})(?!.*(.)\1{2,}).{10}$ - 负先行(?!...)正在测试重复字符

我使用http://regexr.com/测试