Это не должно быть слишком сложно, регулярное выражение /\&\#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]+)\;/
, категорию, которую вы связали, и функцию hex to decimal, которую я создал для выполнения нужной вам замены.
- (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);
}
person
Jeffery Thomas
schedule
16.10.2012