2010-12-15 91 views
2

我有一個正則表達式看起來像這樣:正則表達式崩潰的iPhone

^(\+\d\d)?(?(?<=\+\d\d)((|)\(0\)(|)| |)|(0))(8|\d\d\d?)[-/ ]?\d\d(?\d){1,4} ?\d\d$ 

它用來驗證瑞典的電話號碼。在其他環境中,比如.NET,這個正則表達式工作正常,但是在Objective-c中,它會導致崩潰,並說正則表達式不是有效的正則表達式。在正則表達式方面,我遠非專家,所以我想知道是否有人可以幫我找到這個正則表達式不起作用的原因。

我使用Reggy驗證正則表達式和問題似乎是這組

(?(?<=\+\d\d)((|)\(0\)(|)| |)|(0)) 

,但我想不出爲什麼......如果我刪除從開始和結束(?)這一組中,撞車消失。有誰知道(?是做什麼的?據我所知,?用於指定一個組是可選的,但是它在組的最開始使用時意味着什麼?

回答

1

我做你的正則表達式「清晰」通過將其轉化爲詳細的形式和註釋,所以你可以看到它正在試圖做的事。我希望你會同意,大部分是賺不了多少意義:

^     # Start of string 
(\+\d\d)?   # Match + and two digits optionally, capture in backref 1 
(?(?<=\+\d\d)  # Conditional: If it was possible to match +nn previously, 
(\s?\(0\)\s?|\s|) # then try to match (0), optionally surrounded by spaces 
        # or just a space, or nothing; capture that in backref 2 
|     # If it was not possible to match +nn, 
(0)    # then match 0 (capture in backref 3) 
)     # End of conditional 
(8|\d\d\d?)   # Match 8 or any two-three digit combination --> backref 4 
[-/\s]?    # match a -,/or space optionally 
\d\d    # Match 2 digits, don't capture them 
(\s?\d){1,4}  # Match 1 digit, optionally preceded by spaces; 
        # do this 1 to 4 times, and capture only the last match --> backref 5 
\s?\d\d    # Match an optional space and two digits, don't capture them 
$     # End of string 

在其目前的形式,它驗證串像

+46 (0) 1234567 
+49 (0) 1234567 
+00 1234567 
+99 08 11 1 11 

012-34 5 6 7 8 90 

,並在字符串失敗像

+7 123 1234567 
+346 (77) 123 4567 
+46 (0) 12/34 56 7 

所以我非常懷疑它正在做它應該做的。除此之外,大多數正則表達式可以被簡化很多,放棄了正在使用正則表達式庫的條件。如果您的客戶堅持要求優化某些內容沒有多大意義,但是如果您的客戶堅持,這裏是一個功能完全相同但沒有條件的版本:

^(?:\+\d\d(?: ?(?:\(0\)\s?)?)?|0)(?:8|\d\d\d?)[-/ ]?\d\d(?: ?\d){1,4} ?\d\d$ 
+0

謝謝!我還沒有自己創建正則表達式,所以我不確定規則和允許的電話號碼格式。它來自我的客戶正在使用的另一個(網絡)應用程序,他們現在希望在iPhone應用程序中實施相同的驗證。 – andlin 2010-12-15 12:11:51

+0

這就是我所期望的。將編輯我的答案。雖然你一定要告訴你的客戶,你正在用一些破碎的東西來取代某些東西。 – 2010-12-15 15:54:14

相關問題