2015-09-04 42 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/測試