文字列中にある英語のみテキスト色を変更する正規表現のサンプルです。
前回のNSAttributedStringを利用しています。
NSRegularExpressionSample.m
- (void)drawRect:(CGRect)rect
{
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:@"iPhone 3GS以降のどのiPhoneにも、臭素系難燃剤(BFR)やポリ塩化ビニル(PVC)は使われていません。これには私たちの最新のiPhoneであるiPhone 5も含まれます。事実、AppleのBFRやPVCの不使用に関する基準は、業界で最も厳格なものの一つです。しかも私たちは、サプライヤーに対しても同じ基準を求めています。クパチーノにあるAppleの研究所では、製品を個別の部品と素材に分解し、その後、蛍光X線分光やイオンクロマトグラフィーなどの様々な方法でそれらを検査します。この方法によって、Appleが販売するあらゆる製品がAppleの環境基準を満たしているかどうかを確認できるのです。"];
/* 全体のフォントサイズを指定 */
[attrStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:20.f]
range:NSMakeRange(0, attrStr.length)];
/* 正規表現で一致する全てのNSRangeを取得する */
NSError *error = nil;
// アルファベットを指定
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"([a-zA-Z]*)" options:0 error:&error];
if (error == nil) {
NSArray *arr = [regexp matchesInString:attrStr.string options:0 range:NSMakeRange(0, attrStr.length)];
for (NSTextCheckingResult *match in arr) {
// 一致する範囲の色設定
[attrStr addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:[match rangeAtIndex:1]];
}
}
[attrStr drawInRect:rect];
}
##NSRegularExpression
注意点は、NSStringと正規表現の2つのエスケープが混在することです。
例えば、「*」をエスケープする場合、正規表現では「\」となります。
しかしNSStringには「\」というエスケープはない為
Unknown escape sequence '\*'
の警告が出ます。(まぁ無視しても正規表現は正常に機能してますが)
この警告を外すには「\」をNSStringでのエスケープをすればよいので「\\」になり、全体では「\\*」となります。
##NSTextCheckingResult
正規表現の一致結果を持っています。
rangeAtIndex:0 は全体の一致を、
rangeAtIndex:1 ()内の一致する範囲になります。
※ 複数の()を指定した場合1以降
[例]
対象: AppleからiPhone 3GSが発売
正規表現: @"i([a-zA-Z]*) 3GS)"
rangeAtIndex:0 → iPhone 3GS
rangeAtIndex:1 → Phone