我做你的正則表達式「清晰」通過將其轉化爲詳細的形式和註釋,所以你可以看到它正在試圖做的事。我希望你會同意,大部分是賺不了多少意義:
^ # 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$
謝謝!我還沒有自己創建正則表達式,所以我不確定規則和允許的電話號碼格式。它來自我的客戶正在使用的另一個(網絡)應用程序,他們現在希望在iPhone應用程序中實施相同的驗證。 – andlin 2010-12-15 12:11:51
這就是我所期望的。將編輯我的答案。雖然你一定要告訴你的客戶,你正在用一些破碎的東西來取代某些東西。 – 2010-12-15 15:54:14