繁体   English   中英

正则表达式以匹配所有罗马尼亚电话号码

[英]Regex to match all Romanian phone numbers

我在整个Google上进行了搜索,以找到一些方法来验证电话号码是否为罗马尼亚语,但没有找到任何对我有帮助的方法...我想要一种正则表达式验证器,用于以下数字格式:

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应该包含任何数字,但不应有相同的数字。例如0000000 1111111等。

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

有什么办法吗?

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

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}$)")},
};

如果我正确理解规则,则此模式应该有效:

^(?<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}) -负前瞻,可确保其余六个数字与第一个数字不同
    • \\d{6} -匹配其余六位数字
  • | - 运算子
  • (?:251|351)(?(paren)\\))(?<first>\\d)(?!\\k<first>{5})\\d{5} -第二种格式
    • (?:251|351) -接下来的三位数必须为251351
    • (?(paren)\\)) -如果在此处有开头(存在,则必须有一个结尾)
    • (?<first>\\d) -仅匹配结尾六位数字中的第一位并将其捕获到名为first的组中
    • (?!\\k<first>{5}) -负前瞻,可确保其余五个数字与第一个数字不同
    • \\d{5} -匹配其余五位数字
  • ) -结束指定两种可能格式的非捕获组
  • $ -匹配项必须一直到输入字符串的

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

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

这符合您的示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM