これはそれほど難しくないはずです。正規表現は/\&\#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);
}