这个方法怎么样也就是说,枚举匹配字符串,与这个问题的代码不同?
更具体地说,我正在尝试使用NSRegularExpression来制作正则表达式,以查找字符串中的匹配项。然后,对于每个这样的比赛,我想用该比赛的修改版本替换它。在这样的情况下,我将 HTML 实体中的十六进制更改为十进制,例如  ;->  ;).我已经有PHP代码来解决从十六进制到十进制的转换,但我需要在Objective-C中编写基本相同的方法。
这两种方法中的任何一种或两种都适用于此目的吗?
提前谢谢你!
这应该不会太难,正则表达式是/&#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]+);/
,您链接的类别以及我创建的十六进制到十进制函数来执行您想要的替换。
- (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);
}