IOS開発でよく使われる正規表現
正規表現はテキストマッチングのためのツールで、文法が美しく、簡潔です。開発においては、検索、比較及び文字列のマッチングは日常茶飯事であり、正規表現を通じてこれらの業務をいくつかの需要規則として説明し、コードをより美しく、実用的にする。例えば、ユーザーが入力したパスワードの長さが6~18桁の長さを満たしているかどうかを検証します。初心者の最も一般的な検証方法は入力のパスワードの長さを判断することです。
return(text Field.text.length)=6&text Field.text.leng<=18)
このような判断は問題ないですが、上の検証は正規表現のマッチング文字として短く精悍です。
^.{6,18}$
また、固定電話のほとんどは0区番号-8桁の数字の形式です。正規表現のマッチングは以下の通りです。
^0\d{2}-?\d{8}
また、例えば、パスワード強度の認証。現在のパスワードには、1つ以上の大文字と小文字が含まれています。これに対して、正規表現のマッチングは
(^.*[A-Z]+.*[a-z]+.*.*[a-z]+.*[A-Z]+.*)
式文字解析
新米開発者であれば、上記の正規表現は理解できない可能性が高いです。まず最初のマッチ条件を見て、6-18ビットのパスワードの長さに合わせます。テーマの要求によって、{6,18}が6-18位であると簡単に判断できます。ここで、{n}一致文字はn回繰り返します。n,}マッチングはn回以上繰り返します。{n,m’整合はnからmの間の回数を繰り返す。
読者の対^と$の三つの記号は不明かもしれません。は特殊な記号で、前者は一致する文字列の先頭を表し、後者は一致する文字列の最後を表します。長い文字列の中でいくつかの小さなセグメント文字列とマッチする必要がある場合がありますので、この2つの記号を適切に使うと、マッチング回数を減らして実行効率を高めることができます。
これらの文字の代表的な意味に合わせて、記号は任意の文字を表します。この特殊記号は前の記号の桁数を表しています。結合して、{6,18}$は、セグメント6から18ビットの長さの文字列と一致するので、パスワードの長さを検証するために使用できます。
もちろんです。文字のマッチング率が高すぎて、より多くの場合は具体的に数字やアルファベット、さらには正確な数字とアルファベットにマッチする必要があります。文字以外にも、\dは任意の単一の数字を表します。\wは任意の文字または数字を表します。あるいは、直接0-9の任意の数字を使って具体的な数字を表します。特殊記号前の文字が0か1かを表します。
上の^0\d{2}\-?\d{8}は数字0で始まる2つの数字にマッチしています。後は-番号と8つの数字に続いて、最後の文字列は010-888888でも、0208989898でも正確にマッチングできます。
最後の表現は一番複雑な表現かもしれません。上の部分記号による解析です。私たちは大丈夫です
^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$
分割 ^.*[A-Z]+.*[a-z]+.*$ かかと ^.*[a-z+.*[A-Z]+.*
この二つの別々の表現は、論理的または論理的であることが分かります。前の表現を分割して、この表現の整合規則を一歩ずつ識別します。ここでは式を分解する方法を教えます。式の文字を二つの種類に分けます。値表現と修飾表現です。値表現とは、この記号がある値を表しています。\\dは数字を表しています。任意の非改行記号を表しています。修飾表現は、値を修飾してある条件を達成するために用いられます。たとえば、{2}は前の値を2回繰り返し、*前の値を0回以上繰り返していることを表します。この方法によれば、^.*[A-Z]+.*[a-z]+.*$は部分に分割されてもよい。
これ以上話しません。
ここで紹介するのは*前の値記号が任意の回数を繰り返すことを意味します。
[A-Z]+-は、左の値から右の値までの間のすべての値からなる閉セットを表します。[]括弧で表している値は、必ず括弧の中間集合のサブセットである必要があります。括弧の中には複数のセットがあります。例えば、「A-Z 0-9 a-z」は、任意の大きさにマッチする文字または数字を表しています。+同じ*に似ていますが、+は少なくとも一つの重複値を表しています。
上の解析と組み合わせると、^.*[A-Z]+.*[a-z]+.*$は任意の数の文字で始まることを表し、次に大文字の後に任意の数の文字と小文字があり、その後は任意の数の数字、アルファベットまたは文字です。一方、^.*[a-z]+.*[A-Z]+.*$は小文字が大文字の前にある任意の数の文字の位置を表しています。この2つのマッチは文字列の中に少なくとも1つの小文字と1つの大文字が含まれていることを確認できます。
ps:ちょっと注意したいのですが、上記の表現解析時に\dという特殊記号が私達のコードの中に一つ増えています。基本的にはすべての記号の意味が必要です。
文法/文字説明表
値の表現
..。 改行以外の任意の文字にマッチします。
\w アルファベットまたは数字にマッチする文字
\W アルファベットまたは数字ではない任意の文字にマッチします。
\s 任意の空白文字(スペース、タブ、改行)にマッチします。
\S 空白ではない任意の文字にマッチします。
\d 任意の数字にマッチ
\D 任意の数字以外の文字にマッチします。
\b 単語の最後または先頭の文字にマッチします。
\B 単語の最後または先頭ではない文字にマッチします。
[^x] x以外の任意の文字にマッチします。[a-z]のように小文字以外の任意の文字にマッチします。
^ 文字列の先頭に合わせる
$ 文字列の最後にマッチします。
表現を飾る
* 繰り返し回数にマッチ
+ 繰り返し回数にマッチ
? 1回または0回のマッチ
{n} マッチングの繰り返しn回
{n,} マッチングはn回以上繰り返します。
{n,m}マッチングは最小n回で最大m回まで繰り返します。
上に挙げた文字のほかに、位置指定などの使いにくい正規表現もありますが、上の文字はもう十分です。もっと多くの知識を知りたいのですが、Googleさんを見ることができます。
コードの操作
上では正規表現の各文字の意味を簡単に説明しましたが、iOS開発ではどのように使うべきですか?正規規則を意図的に使用して整合する開発者に対しては、パッケージをカテゴリ別の方法にすることを提案します。自分でカプセル化したコードで説明します。これらの方法はUICTextField法を拡張することにより実現される。
@interface UICText Field(LXDValidate)
//*テキストボックスが空かどうかを判断します。(正規表現ではない)*/
-(BOOL)isEmpty
//*メールボックスが正しいかどうかを判断する*/
-(BOOL)validateEmail;
//*検証コードが正しいかどうかを判断する*/
-(BOOL)validateAuthen;
//*パスワードのフォーマットが正しいかどうかを判断します。
-(BOOL)validatePassword;
//*携帯の番号が正しいかどうかを判断します。
-(BOOL)validatePhone eNumber;
//*自分で正則を書いて入ってきて判断します。
-(BOOL)validateWithRegExp:(NSString*)regExp;
@end
メソッド実現ファイル:
return(text Field.text.length)=6&text Field.text.leng<=18)
このような判断は問題ないですが、上の検証は正規表現のマッチング文字として短く精悍です。
^.{6,18}$
また、固定電話のほとんどは0区番号-8桁の数字の形式です。正規表現のマッチングは以下の通りです。
^0\d{2}-?\d{8}
また、例えば、パスワード強度の認証。現在のパスワードには、1つ以上の大文字と小文字が含まれています。これに対して、正規表現のマッチングは
(^.*[A-Z]+.*[a-z]+.*.*[a-z]+.*[A-Z]+.*)
式文字解析
新米開発者であれば、上記の正規表現は理解できない可能性が高いです。まず最初のマッチ条件を見て、6-18ビットのパスワードの長さに合わせます。テーマの要求によって、{6,18}が6-18位であると簡単に判断できます。ここで、{n}一致文字はn回繰り返します。n,}マッチングはn回以上繰り返します。{n,m’整合はnからmの間の回数を繰り返す。
読者の対^と$の三つの記号は不明かもしれません。は特殊な記号で、前者は一致する文字列の先頭を表し、後者は一致する文字列の最後を表します。長い文字列の中でいくつかの小さなセグメント文字列とマッチする必要がある場合がありますので、この2つの記号を適切に使うと、マッチング回数を減らして実行効率を高めることができます。
これらの文字の代表的な意味に合わせて、記号は任意の文字を表します。この特殊記号は前の記号の桁数を表しています。結合して、{6,18}$は、セグメント6から18ビットの長さの文字列と一致するので、パスワードの長さを検証するために使用できます。
もちろんです。文字のマッチング率が高すぎて、より多くの場合は具体的に数字やアルファベット、さらには正確な数字とアルファベットにマッチする必要があります。文字以外にも、\dは任意の単一の数字を表します。\wは任意の文字または数字を表します。あるいは、直接0-9の任意の数字を使って具体的な数字を表します。特殊記号前の文字が0か1かを表します。
上の^0\d{2}\-?\d{8}は数字0で始まる2つの数字にマッチしています。後は-番号と8つの数字に続いて、最後の文字列は010-888888でも、0208989898でも正確にマッチングできます。
最後の表現は一番複雑な表現かもしれません。上の部分記号による解析です。私たちは大丈夫です
^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$
分割 ^.*[A-Z]+.*[a-z]+.*$ かかと ^.*[a-z+.*[A-Z]+.*
この二つの別々の表現は、論理的または論理的であることが分かります。前の表現を分割して、この表現の整合規則を一歩ずつ識別します。ここでは式を分解する方法を教えます。式の文字を二つの種類に分けます。値表現と修飾表現です。値表現とは、この記号がある値を表しています。\\dは数字を表しています。任意の非改行記号を表しています。修飾表現は、値を修飾してある条件を達成するために用いられます。たとえば、{2}は前の値を2回繰り返し、*前の値を0回以上繰り返していることを表します。この方法によれば、^.*[A-Z]+.*[a-z]+.*$は部分に分割されてもよい。
これ以上話しません。
ここで紹介するのは*前の値記号が任意の回数を繰り返すことを意味します。
[A-Z]+-は、左の値から右の値までの間のすべての値からなる閉セットを表します。[]括弧で表している値は、必ず括弧の中間集合のサブセットである必要があります。括弧の中には複数のセットがあります。例えば、「A-Z 0-9 a-z」は、任意の大きさにマッチする文字または数字を表しています。+同じ*に似ていますが、+は少なくとも一つの重複値を表しています。
上の解析と組み合わせると、^.*[A-Z]+.*[a-z]+.*$は任意の数の文字で始まることを表し、次に大文字の後に任意の数の文字と小文字があり、その後は任意の数の数字、アルファベットまたは文字です。一方、^.*[a-z]+.*[A-Z]+.*$は小文字が大文字の前にある任意の数の文字の位置を表しています。この2つのマッチは文字列の中に少なくとも1つの小文字と1つの大文字が含まれていることを確認できます。
ps:ちょっと注意したいのですが、上記の表現解析時に\dという特殊記号が私達のコードの中に一つ増えています。基本的にはすべての記号の意味が必要です。
文法/文字説明表
値の表現
..。 改行以外の任意の文字にマッチします。
\w アルファベットまたは数字にマッチする文字
\W アルファベットまたは数字ではない任意の文字にマッチします。
\s 任意の空白文字(スペース、タブ、改行)にマッチします。
\S 空白ではない任意の文字にマッチします。
\d 任意の数字にマッチ
\D 任意の数字以外の文字にマッチします。
\b 単語の最後または先頭の文字にマッチします。
\B 単語の最後または先頭ではない文字にマッチします。
[^x] x以外の任意の文字にマッチします。[a-z]のように小文字以外の任意の文字にマッチします。
^ 文字列の先頭に合わせる
$ 文字列の最後にマッチします。
表現を飾る
* 繰り返し回数にマッチ
+ 繰り返し回数にマッチ
? 1回または0回のマッチ
{n} マッチングの繰り返しn回
{n,} マッチングはn回以上繰り返します。
{n,m}マッチングは最小n回で最大m回まで繰り返します。
上に挙げた文字のほかに、位置指定などの使いにくい正規表現もありますが、上の文字はもう十分です。もっと多くの知識を知りたいのですが、Googleさんを見ることができます。
コードの操作
上では正規表現の各文字の意味を簡単に説明しましたが、iOS開発ではどのように使うべきですか?正規規則を意図的に使用して整合する開発者に対しては、パッケージをカテゴリ別の方法にすることを提案します。自分でカプセル化したコードで説明します。これらの方法はUICTextField法を拡張することにより実現される。
@interface UICText Field(LXDValidate)
//*テキストボックスが空かどうかを判断します。(正規表現ではない)*/
-(BOOL)isEmpty
//*メールボックスが正しいかどうかを判断する*/
-(BOOL)validateEmail;
//*検証コードが正しいかどうかを判断する*/
-(BOOL)validateAuthen;
//*パスワードのフォーマットが正しいかどうかを判断します。
-(BOOL)validatePassword;
//*携帯の番号が正しいかどうかを判断します。
-(BOOL)validatePhone eNumber;
//*自分で正則を書いて入ってきて判断します。
-(BOOL)validateWithRegExp:(NSString*)regExp;
@end
メソッド実現ファイル:
#import "UITextField+LXDValidate.h"
@implementation UITextField (LXDValidate)
- (BOOL)isEmpty
{
return self.text.length == ;
}
- (BOOL)validateEmail
{
return [self validateWithRegExp: @"^[a-zA-Z-]{,}@[a-z-A-Z]{,}\\.[a-zA-Z]{,}$"];
}
- (BOOL)validateAuthen
{
return [self validateWithRegExp: @"^\\d{,}$"];
}
- (BOOL)validatePassword
{
NSString * length = @"^\\w{,}$"; //
NSString * number = @"^\\w*\\d+\\w*$"; //
NSString * lower = @"^\\w*[a-z]+\\w*$"; //
NSString * upper = @"^\\w*[A-Z]+\\w*$"; //
return [self validateWithRegExp: length] && [self validateWithRegExp: number] && [self validateWithRegExp: lower] && [self validateWithRegExp: upper];
}
- (BOOL)validatePhoneNumber
{
NSString * reg = @"^\\d{}$";
return [self validateWithRegExp: reg];
}
- (BOOL)validateWithRegExp: (NSString *)regExp
{
NSPredicate * predicate = [NSPredicate predicateWithFormat: @"SELF MATCHES %@", regExp];
return [predicate evaluateWithObject: self.text];
}
@end
以上の内容は小编で绍介したIOS开発に関する定番表式です。