MSLibrary。 iOSなどの正規表現を使用した電話番号のキャプチャと検証...パート2

記事の最初の部分では、 iOSライブラリのMSLibrary 開発者は、 RFC 3966で公開された国際標準の観点から電話番号の構造の特徴について話し、電話番号の国際構造、企業のWEBダイヤル標準、相互の相互作用、およびそれらの動作を調べましたユーザー
既に述べたように、キャプチャと検証は異なるタスクですが、それらで使用される正規表現が主に異なる同様の方法で解決されます。 記事の後半では、正規表現に焦点を当てます。

電話番号の確認

電話番号文字列の検証または検証の問題に関するステートメントには、いくつかの可能なアプローチがあります。
1.有効な番号を記述し、そのための正規表現を作成する最も簡単な方法を1つ選択します
2.電話番号の有効なスペルの最大数を考慮し、それらの正規表現を構築します

どちらのアプローチにも存在する権利がありますが、それぞれに特定の結果が伴います。
最初のケースでは、ユーザーは検証を実行する形式で番号を入力する必要があります。これにより、多くの場合エラーが発生し、その結果、アプリケーションに対する否定的な態度が生じます。 開発者は、データを入力するためのテンプレート、または選択した有効なフォームに入力したデータを追加する追加コードを作成する必要があります。
2番目のケースでは、テンプレートと追加コードなしで行うことができ、「スペースなしで電話番号を入力する」などの小さな指示に制限されます。

両方のオプションを検討しますが、最初に一般的な考慮事項を検討してください。

電話番号文字列を検証してiOSで適切に処理されるようにするには、いくつかの条件があります。
1.番号の一般的な構造は、 RFC 3966に準拠している必要があります

telephone-uri = global-number-digits [extension] 
1

2.電話番号は常に数字で始まり、数字で終わる必要があります

3. global-number-digitsの構造は、条項2を考慮してRFC 3966に準拠する必要があります記事の最初の部分を参照
  global-number-digits = "+" * DIGIT * phonedigit DIGIT 

4. global-number-digitsのデジタル文字の数は、11〜13桁の範囲である必要があります(この条件は、電話番号の国際構造に基づいています)

5.オプションの要素の構造-拡張[拡張]は、RFC 3966で提案されているものとは異なる必要があります
 内線番号=( ";" | * "、")1 *(DIGIT * phonedigit DIGIT) 

図1に示す図の対応する値を代入して、iOSの有効な有効な電話番号のより詳細な構造を取得します。

 telephone-uri = "+" DIGIT (9-11)*phonedigit DIGIT [(";" | *",") DIGIT *phonedigit DIGIT] 
2

そして、結果の構造(図2)がタスクと国際的な合意を確実に満たすようになったときだけ、正規表現の構築を開始できます。

明確にするために、図に示す構造の各部分の正規表現から始めます。 2。


 正規表現[0-9]
 REGEX_OBJC_STRING @ "\\ d" 

電話番号
 正規表現[0-9] | [-\。\(\)]
 REGEX_OBJC_STRING @ "\\ d | [-\\。\\(\\)]" 

最初のオプションの正規表現の構築を始めましょう。 最も簡単なものを1つ選択してみましょう。たとえば、iOSシステムの有効な電話番号を記述します。
 +14089961010; 1234

この電話番号の構造を記述する正規表現は次のとおりです。
 正規表現^((?:\ +?[0-9] {11,13})(?:(; |、+)[0-9] +)?)$ 

この式を解析しましょう:
 ^(#行の先頭
 (?:#global-number-digitsブロックの始まり
 \ +?  #「+」記号(使用は1回のみ)
 [0-9]#global-number-digitsブロックのDIGITセグメント
 {11,13}#DIGITセグメントが11〜13回使用可能なポインター
 )#global-number-digitsブロックの終わり
 (?:#拡張ブロックの始まり
 (; |、+)#拡張子の始まりを示すセパレータ
 [0-9] +#セグメントDIGITブロック拡張
 )?  #拡張ブロックの終わり
 )$#行末


そのため、考慮される最初のオプションでは、次の正規表現を使用して、アプリケーションのiOSコードで使用する前に電話番号を検証できます。

  REGEX_OBJC_STRING @ "^((?:\\ +?\\ d {11,13})(?:(; |、+)\\ d +)?)$" 

iOSシステムに有効な2番目のオプションでは、図に示す構造に完全に準拠する電話番号です。 2、正規表現は次のとおりです。
 正規表現^((?:\ +?[0-9]([-。\(\)]?[0-9]){10,12})(?:(; |、+)([0-9 ]([-。\(\)]?[0-9])?)+)?)$ 

この式を解析しましょう:
 ^(#行の先頭
 (?:#global-number-digitsブロックの始まり
 \ +?  #「+」記号(使用は1回のみ)
 [0-9]#global-number-digitsブロックの最初のDIGITセグメント
 (#グローバル番号桁ブロックのphonedigitセグメントの先頭
 [-。\(\)]?  #視覚的な区切り記号(このセグメントで複数回使用することはできません)
 [0-9]#global-number-digitsブロックの2番目のDIGITセグメント
 )#global-number-digitsブロックのphonedigitセグメントの終わり
 {10,12}#phonedigitセグメントが10〜12回可能という事実へのポインター
 )#global-number-digitsブロックの終わり
 (?:#拡張ブロックの始まり
 (; |、+)#拡張子の始まりを示すセパレータ
 (#拡張ブロックのデジタル部分の先頭
 [0-9]#DIGIT拡張ブロックの最初のセグメント
 (#拡張ブロックのphonedigitセグメントの先頭
 [-。\(\)]?  #視覚的な区切り記号(このセグメントで複数回使用することはできません)
 [0-9]#DIGIT拡張ブロックの2番目のセグメント
 )?  #拡張ブロックのphonedigitセグメントの終わり
 )+#拡張ブロックのデジタル部分の終わり
 )?  #拡張ブロックの終わり
 )$#行末


そのため、考慮されるオプションから2番目に、アプリケーションのiOSコードで使用する前に、次の正規表現を使用して電話番号を検証できます。

  REGEX_OBJC_STRING @ "^((?:\\ +?\\ d([-。\\(\\)]?\\ d){10,12})(?:(; |、+)(\\ d ([-。\\(\\)]?\\ d)?)+)?)$ " 


電話番号の取得

キャプチャとは、テスト対象の数字と記号のセットを電話番号にできるという定義です。 電話番号を取得するための正規表現を作成する場合、分析された行では次のことに留意する必要があります。
1.必要な順序で電話番号を正常に検証するために必要なすべての要素を含める必要があります

2.外来元素が含まれている

3.有効な区切り文字は無効に置き換えることができます

2番目と3番目のポイントについて、さらに詳しく説明する必要があります。 「外来」要素と「無効」要素の非常に曖昧な概念を理解してみましょう。

視覚的な区切りとして、上記で説明したものに加えて、空白は手動入力によく使用されます。 スペースは、無効な区切り文字としても、区切り文字の前後にある場合は、外部要素としても使用できます。
拡張機能の開始を示すために、次の無効な区切り文字を使用できます。
  「x」|  「ext」|  「:」|  「p」|  「= 


上記を考慮すると、phonedigitの正規表現と内線番号の先頭をマークする区切り文字は次の形式になります。
電話番号
 正規表現[0-9] |(\ s?[-\。\(\)\ S] \ s?)
 REGEX_OBJC_STRING @ "[0-9] |(\\ s?[-\\。\\(\\)\\ s] \\ s?)" 

拡張セパレーター
 正規表現(x | ext | p |; | = |、+)
 REGEX_OBJC_STRING @ "(x | ext | p |; | = |、+)" 


設定された条件を満たす正規表現は次のとおりです。
 正規表現^(\ s?(?:(\ +?\ S?[0-9]((\ s?[-\。\(\)\ S] \ s?)?[0-9]){10 、12}))(?:((X | ext | p |; | = |、+)(\ s?[0-9]((\ s?[-\。\(\)\ S] \ s ?)?[0-9])?)+)?)$ 

この式を解析しましょう:
 ^(#行の先頭
 \ s?  #行頭にスペースを入れる
 (?:(#global-number-digitsブロックの始まり
 \ +?  #「+」記号(使用は1回のみ)
 \ s?  #「+」記号の後に許可されるスペース
 [0-9]#global-number-digitsブロックの最初のDIGITセグメント
 (#グローバル番号桁ブロックのphonedigitセグメントの先頭
 (\ s?[-\。\(\)\ s] \ s?)?  #視覚的な区切り記号(このセグメントで複数回使用することはできません)
 [0-9]#global-number-digitsブロックの2番目のDIGITセグメント
 )#global-number-digitsブロックのphonedigitセグメントの終わり
 {10,12}#phonedigitセグメントが10〜12回可能という事実へのポインター
 ))#global-number-digitsブロックの終わり
 (?:(#拡張ブロックの始まり
 (x | ext | p |; | = |、+)#セパレーター、拡張子の始まりを示す
 (#拡張ブロックのデジタル部分の先頭
 \ s?  #拡張ブロックのデジタル部分の先頭に許可されたスペース
 [0-9]#DIGIT拡張ブロックの最初のセグメント
 (#拡張ブロックのphonedigitセグメントの先頭
 (\ s?[-\。\(\)\ s] \ s?)?  #視覚的な区切り記号(このセグメントで複数回使用することはできません)
 [0-9]#DIGIT拡張ブロックの2番目のセグメント
 )?  #拡張ブロックのphonedigitセグメントの終わり
 )+#拡張ブロックのデジタル部分の終わり
 )?  #拡張ブロックの終わり
 )$#行末


したがって、設定された条件を満たす電話番号を取得するには、次の正規表現を使用できます。

  REGEX_OBJC_STRING @ "^(\\ s?(?:(\\ +?\\ s?\\ d?(\\ s?[-\\。\\(\\)\ s] \\ s?)? \\ d){10,12}))(?:((x | ext | p |; | = |、+)(\\ s?\\ d((\\ s?[-\\。\\ (\\)\\ s] \\ s?)?\\ d)?)+)?)$ " 

この方法でキャプチャされた電話番号を使用するには、それを正規化する必要があります。つまり、iOSで使用するために文字列を有効な形式にする必要があります。 標準化技術の説明は、この記事の範囲外です。 iOSライブラリのMSLibraryでは、このタスクは1つの関数を使用することで解決されるとしか言えません。

まとめると

電話番号文字列を検証または検証するタスクは、次のいずれかの正規表現を使用して解決されます。
  REGEX_OBJC_STRING @ "^((?:\\ +?\\ d {11,13})(?:(; |、+)\\ d +)?)$" 

  REGEX_OBJC_STRING @ "^((?:\\ +?\\ d([-。\\(\\)]?\\ d){10,12})(?:(; |、+)(\\ d ([-。\\(\\)]?\\ d)?)+)?)$ " 

電話番号を含む文字列をキャプチャするタスクは、次の正規表現を使用して解決できます。
  REGEX_OBJC_STRING @ "^(\\ s?(?:(\\ +?\\ s?\\ d?(\\ s?[-\\。\\(\\)\ s] \\ s?)? \\ d){10,12}))(?:((x | ext | p |; | = |、+)(\\ s?\\ d((\\ s?[-\\。\\ (\\)\\ s] \\ s?)?\\ d)?)+)?)$ " 

NSRegularExpressionクラスのメソッドを使用してiOSアプリケーションを開発するときに、結果の正規表現を使用できます。

iOSライブラリのMSLibraryには、このための独自のツールもあります。 たとえば、msfFRMreqMatchesInString関数

 BOOL msfFRMreqMatchesInString(NSString *string, NSString *regularExpression, NSInteger reqNumberOfMatches) 
3

この関数は、文字列「string」が正規表現「regularExpression」と特定の回数一致するかどうかに応じて、値「YES」または「NO」を取ります-「reqNumberOfMatches」。 ご覧のとおり、この質問はたった1行のコードで解決されます。
さらに、ライブラリには、「あらゆる場面で」慎重に選択された数十個の正規表現があります。




この資料がお役に立てば幸いです。MSLibraryfor iOSチーム

その他の記事:
iOSなどの正規表現を使用した電話番号のキャプチャと検証...パート1
iOSなどで、ビットマスクを使用して複数の条件を実装する...
簡単:iOSだけでなく、文字列から不要な文字を削除します...
Xcodeでのクロスプラットフォーム(ユニバーサル)ライブラリの作成とコンパイル

Source: https://habr.com/ru/post/J278359/


All Articles