1

enumerateMatchesInString であるこのメソッドは、この質問のコードとどう 違うのですか?

より具体的には、NSRegularExpression を使用して正規表現を作成し、文字列内の一致を見つけようとしています。次に、そのような一致ごとに、その一致の修正版に置き換えたいと思います。そのような状況の 1 つで、HTML エンティティで 16 進数を 10 進数に変更しています。->  ; )。16 進数から 10 進数への変換に対処する PHP コードは既にありますが、基本的に同じメソッドを Objective-C で記述する必要があります。

これら 2 つの方法のいずれかまたは両方がその目的に有効でしょうか?

前もって感謝します!

4

1 に答える 1

1

これはそれほど難しくないはずです。正規表現は/\&\#x([0-9a-fA-F]+)\;/.

キャプチャされた番号を文字列に取得したら、NSScanner.

int value = NSNotFound;
[[NSScanner scannerWithString:capturedHexString] scanHexInt:&value];
NSString *decimalString = [NSString stringWithFormat:@"%d", value];

それが役立つことを願っています。


説明

これを単純な関数として引き出します

static inline NSString *MyDecimalStringFromHexString(NSString *hexString)
{
    unsigned value = NSNotFound;
    [[NSScanner scannerWithString:hexString] scanHexInt:&value];

    NSString *decimalString = nil;

    if (value != NSNotFound)
        decimalString = [NSString stringWithFormat:@"%d", value];

    return decimalString;
}

すべてを一緒に入れて

/\&\#x([0-9a-fA-F]+)\;/これは、正規表現、リンクしたカテゴリ、および必要な置換を実行するために作成した 16 進数から 10 進数への関数を使用する単体テストです。

- (void)testHexEntityToDecimalEntity
{
    NSString *input = @"This 
 is ઼ test";
    NSString *expected = @"This 
 is ઼ test";

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\&\\#x([0-9a-fA-F]+)\\;" options:0 error:nil];

    NSString *actual = [regex stringByReplacingMatchesInString:input options:0 range:NSMakeRange(0, input.length) usingBlock:^NSString *(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
        NSRange hexRange = [result rangeAtIndex:1];
        NSString *hexString = [input substringWithRange:hexRange];
        NSString *decimalString = MyDecimalStringFromHexString(hexString);
        return [NSString stringWithFormat:@"&#%@;", decimalString];
    }];

    STAssertEqualObjects(actual, expected, nil);
}
于 2012-10-16T19:33:18.460 に答える