1

私はかなり長い間この問題に立ち往生していて、通常のグーグル検索で適切な解決策を見つけることができませんでした。文字列の形式を評価しようとしています。より正確には、文字列がカナダの郵便番号であるかどうかを確認しています。

ブログを持っているオタクのおかげで、私はこの正規表現から始めました

^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$

その後、次のようにNSRegularExpressionのインスタンスを作成しました。

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$" options:NSRegularExpressionCaseInsensitive error:&error];

エスケープ用のバックスラッシュが追加されています。

それからNSPredicate正規表現で作りました

NSPredicate *regextest = [NSPredicate
                          predicateWithFormat:@"SELF MATCHES[cd] %@", regex];

そして最後に、文字列自体を評価しています

[regextest evaluateWithObject:@"G2G 2S2"]

その最後の行で、例外がスローされます。

NSInvalidArgumentExceptionオブジェクトから正規表現を作成できません

NSRegularExpression:0x81e1bb0 ^ [ABCEGHJKLMNPRSTVXY] {1} \ d {1} [AZ] {1} * \ d {1} [AZ] {1} \ d {1}$0x1。

私はそれを理解することができません=/私は正規表現テスターで正規表現自体をテストしました、そしてそれは大丈夫です、そして私がグーグルでチェックしたことからそれは文字列評価がどのように行われるべきかです。私はここで迷っています。誰かアイデアがありますか?

4

2 に答える 2

3

[NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", pattern]オブジェクトを渡すのではなく、行でパターンを直接使用する必要がありNSRegularExpressionます。

(さらに、{1}必要がない場合は正規表現からを削除できます。)

NSString* pattern = @"^[ABCEGHJKLMNPRSTVXY]\\d[A-Z] *\\d[A-Z]\\d$";
NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", pattern];

if ([regextest evaluateWithObject:@"G2G 2S2"]) ...

iOSで正規表現を実行するには、NSPredicateクラスまたはクラスのいずれかを使用しますNSRegularExpressionが、両方を使用することはできません。

  • NSPredicate一致するものが見つかったかどうかを確認するだけでよいという単純なケースです。
  • NSRegularExpressionははるかに完全であり、すべての一致、文字列内でのそれらの位置の一覧表示、すべての一致の反復、置換の実行などを行うことができます。

必要に応じて、次のように使用できますNSRegularExpression

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[ABCEGHJKLMNPRSTVXY]\\d[A-Z] *\\d[A-Z]\\d$" options:NSRegularExpressionCaseInsensitive error:&error];
NSUInteger nbFound = [regex numberOfMatchesInString:@"G2G 2S2" options:0 range:NSMakeRange(0,7)];
if (nbFound > 0) ...

ただし、文字列がパターンに一致するかどうかを確認するだけで、それ以上の情報は必要ないため(見つかった文字列の範囲は必要ありません。また、見つかった文字列から置換や部分式を抽出する必要もありません)NSPredicate。使用法には十分であり、単純なYES/NOテストの場合もより効率的である必要があります。

于 2012-09-19T14:34:42.573 に答える
2

NSPredicateパターンでは単なる文字列なので、これは機能します。

NSString *pattern = @"^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$";

NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", pattern];

BOOL result = [regextest evaluateWithObject:@"G2G 2S2"];

ああ、そして私は{1}-パーツを削除する必要があることに同意します-それらはただ雑然と追加します。

于 2012-09-19T14:34:21.630 に答える