例如,如果我有NSString * a =" com42FA&#34 ;; 如何检查字符串是否包含数字,十六进制或数字,但检查从字符4开始到图表7。
答案 0 :(得分:3)
一个简单的解决方案是正则表达式
模式搜索字符集0-9
,A-F
和a-f
中的4个字符。
显式范围NSMakeRange(3, 4)
搜索字符4 - 7(location
参数从零开始)。
NSString *a = @"com42FA";
NSString *pattern = @"[0-9A-Fa-f]{4}";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];
NSRange range = [regex rangeOfFirstMatchInString:a options:0 range:NSMakeRange(3, 4)];
BOOL hexNumberFound = range.location != NSNotFound;
NSLog(@"%d", hexNumberFound);
答案 1 :(得分:2)
作为第三种选择(在编写本文时!),一个简单的循环将处理这个:
NSString *testString = @"com42FA";
NSCharacterSet *hexDigits = [NSCharacterSet characterSetWithCharactersInString:@"0123456789abcdefABCDEF"];
NSUInteger pos = 3;
BOOL isValid = YES;
while (pos <= 6 && isValid) isValid = [hexDigits characterIsMember:[testString characterAtIndex:pos++]];
只要找到无效数字,Justs循环和检查就会停止。
<强>附录强>
由于其他答案提出了性能问题,而不是因为这么小的任务可能会成为一个问题,我提供以下更快的变化:
NSString *testString = @"com42FA";
NSUInteger pos = 3;
BOOL isValid = YES;
while (pos <= 6 && isValid) isValid = isxdigit([testString characterAtIndex:pos++]);
这使用标准C库函数isxdigit()
,无需NSCharacterSet
创建和方法调用。 (这可能不是最快的选择,但在此之后可读性可能会受到影响。)
答案 2 :(得分:1)
对于几乎所有情况,您都可以使用比正则表达式更快的NSScanner
:
NSString *initialString = @"com42FA";
NSScanner *scanner = [NSScanner scannerWithString:initialString];
// Setup the scanner. Depends on your needs
scanner.caseSensitive = NO;
scanner.charactersToBeSkipped = nil;
// Specify the location to start scan from
scanner.scanLocation = 3;
// Actual scanning, note that I'm checking that the scanner at the end
// to understand whether it scanned up to the end of the string
unsigned long long scannedNumber = 0;
BOOL success = [scanner scanHexLongLong:&scannedNumber] && scanner.isAtEnd;
if (success) {
NSLog(@"%llu", scannedNumber); // 17146
<...>
}