【问题标题】:Regex to match all Romanian phone numbers正则表达式匹配所有罗马尼亚电话号码
【发布时间】:2015-09-04 12:13:07
【问题描述】:

我搜索了整个谷歌以找到一些方法来验证电话号码是否是罗马尼亚语,但没有找到任何对我有帮助的东西...... 我想要以下数字格式的正则表达式验证器:

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

有什么办法吗?

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

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

【问题讨论】:

  • 你的定义不够清楚。您提供的硬编码前缀是否需要明确匹配?你允许某些特殊字符吗?您是否试图仅提取数字以便将这些数字存储在数据库中?
  • 抱歉,我已经更新了描述。如果我能允许'()'和'-'分隔数字,那就太好了
  • 为什么要使用正则表达式?您可以手动检查字符串并为自己省去所有痛苦。正则表达式并不总是最好的解决方案。
  • 正如@MichaelPerrenoud 所说,我们很乐意帮助您构建这样的正则表达式,但构建一个好的正则表达式需要了解模式规则。由于我们大多数人都不是来自罗马尼亚,因此您需要非常清楚应该被视为匹配的所有可能变化。要使这个问题成为一个体面的问题,需要一个描述什么匹配和不匹配的规则列表以及一个应该匹配和不应该匹配的示例列表。
  • 我正在使用 Web 应用程序的教程,它正在使用正则表达式

标签: c# regex


【解决方案1】:

如果我正确理解规则,这个模式应该可以工作:

^(?<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})$")}
};

这是模式的含义:

  • ^ - 匹配必须从输入字符串的开头开始
  • (?&lt;paren&gt;\()? - 可选匹配 ( 字符。如果它在那里,它会在一个名为 paren 的组中捕获它
  • 0 - 数字必须以单个 0 开头
  • (?: - 开始一个非捕获组,以匹配两种不同格式之一
  • (?:72|74|75|76|77|78)(?(paren)\))(?&lt;first&gt;\d)(?!\k&lt;first&gt;{6})\d{6} - 第一种格式
    • (?:72|74|75|76|77|78) - 接下来的两位数必须是 727475767778
    • (?(paren)\)) - 如果开头( 存在,那么这里一定有结尾)
    • (?&lt;first&gt;\d) - 仅匹配结尾七位数中的第一个,并将其捕获到名为 first 的组中
    • (?!\k&lt;first&gt;{6}) - 负前瞻,确保其余六位与第一个不同
    • \d{6} - 匹配剩余的六位数字
  • | - or 运算符
  • (?:251|351)(?(paren)\))(?&lt;first&gt;\d)(?!\k&lt;first&gt;{5})\d{5} - 第二种格式
    • (?:251|351) - 接下来的三位数字必须是 251351
    • (?(paren)\)) - 如果开头( 存在,那么这里一定有结尾)
    • (?&lt;first&gt;\d) - 仅匹配结尾六位数中的第一个,并将其捕获到名为 first 的组中
    • (?!\k&lt;first&gt;{5}) - 负前瞻,确保剩余的五位数字与第一个数字不同
    • \d{5} - 匹配剩余的五位数字
  • ) - 结束指定两种可能格式的非捕获组
  • $ - 匹配必须一直到输入字符串的

【讨论】:

  • 这很完美!感谢您提供更多信息,现在如果我需要其他条件,我可以更新此表达式
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这符合你的例子:

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

    【讨论】:

    • 这不会检查长度是否正确,也不会检查“不应该有相同的数字..比如 0000000 1111111 等”
    • @NewWorld 当我发布答案时,它符合需要...:/
    猜你喜欢
    • 2010-12-16
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多