如何从字符串中检查字符,但从第4个字符到第7个字符?

时间:2017-05-18 10:19:42

标签: objective-c nsstring

例如,如果我有NSString * a =" com42FA&#34 ;; 如何检查字符串是否包含数字,十六进制或数字,但检查从字符4开始到图表7。

3 个答案:

答案 0 :(得分:3)

一个简单的解决方案是正则表达式

模式搜索字符集0-9A-Fa-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
  <...>
}