1

这个方法,即 enumerateMatchesInString,与这个问题的代码有什么不同?

更具体地说,我正在尝试使用 NSRegularExpression 来制作正则表达式,以在字符串中查找匹配项。然后,对于每个这样的匹配,我想用该匹配的修改版本替换它。在一种这样的情况下,我将 HTML 实体中的十六进制更改为十进制,例如  ; ->  ; )。我已经有解决从十六进制到十进制转换的 PHP 代码,但我需要在 Objective-C 中编写基本相同的方法。

这两种方法中的任何一种或两种都可以用于此目的吗?

先感谢您!

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]+)\;/、您链接的类别以及我创建的十六进制到十进制函数来执行您想要的替换。

- (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 回答