0

我需要从 GPS 坐标字符串中提取不同的组件。例如:

+30° 18' 12" N  // pull out 30, 18 & 12

或者

+10° 11' 1" E    // pull out 10, 11 & 1

或者

-3° 1' 2" S    // pull out -3, 1 & 2

或者

-7° 12' 2" W    // pull out -7, 12 & 2

我在网上浏览了一下,发现有NSRegularExpression. 我想知道是否可以以某种方式使用它?我还查看了提供的文档,并尝试组合一个正则表达式来提取不同的部分。这就是我想出的:

('+'|'-')$n°\s$n'\s$n"\s(N|E|S|W)

我不确定这是否正确,我也不清楚如何使用它,因为周围没有很多教程/示例。请问有人可以帮我吗?如果有更好的方法来做到这一点而不是使用NSRegularExpression我对它持开放态度,但据我所知,objective c 没有任何内置的正则表达式支持。

4

5 回答 5

4

正则表达式是一种矫枉过正,恕我直言。使用[NSString componentsSeparatedByString:]空格作为分隔符将字符串拆分为多个部分,然后[NSString intValue]梳理除最后一个之外的每个组件的数值。

于 2012-01-23T21:00:35.427 回答
2

RE的矫枉过正(Seva)?对象呢?;-)

NSString *coords = @"+30° 18' 12\" N";

int deg, sec, min;
char dir;

if(sscanf([coords UTF8String], "%d° %d' %d\" %c", &deg, &min, &sec, &dir) != 4)
   NSLog(@"Bad format: %@\n", coords);
else
   NSLog(@"Parsed %d deg, %d min, %d sec, dir %c\n", deg, min, sec, dir);

你是否喜欢这个取决于你对 C 的看法,但它是直接和简单的。

于 2012-01-23T21:20:40.167 回答
2

使用 NSScanner:

NSScanner *scanner;
NSCharacterSet *numbersSet = [NSCharacterSet characterSetWithCharactersInString:@" °'"];
int degrees;
int minutes;
int seconds;

NSString *string = @" -7° 12' 2\" W";
scanner = [NSScanner scannerWithString:string];
[scanner setCharactersToBeSkipped:numbersSet];
[scanner scanInt:&degrees];
[scanner scanInt:&minutes];
[scanner scanInt:&seconds];
NSLog(@"degrees: %i, minutes: %i, seconds: %i", degrees, minutes, seconds);

NSLog 输出:

degrees: -7, minutes: 12, seconds: 2
于 2012-01-23T21:53:51.357 回答
0
NSMutableArray *newCoords = [[NSMutableArray alloc] init];
NSArray *t = [oldCoords componentsSeparatedByString: @" "];

[newCoords addObject: [[t objectAtIndex: 0] intValue];
[newCoords addObject: [[t objectAtIndex: 1] intValue];
[newCoords addObject: [[t objectAtIndex: 2] intValue];

假设您在帖子中给出了坐标NSString oldCoords,这将导致一个包含您需要的三段数据的NSMutableArray调用。newCoords

于 2012-01-23T21:05:37.487 回答
0

你需要的是:@"([+-]?[0-9]+)"

这是示例代码:

NSString *string;
NSString *pattern;
NSRegularExpression *regex;
NSArray *matches;

pattern = @"([+-]?[0-9]+)";

regex = [NSRegularExpression
         regularExpressionWithPattern:pattern
         options:NSRegularExpressionCaseInsensitive
         error:nil];

string = @" -7° 12' 2\" W";
NSLog(@"%@", string);
matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
degrees = [[string substringWithRange:[[matches objectAtIndex:0] range]] intValue];
minutes = [[string substringWithRange:[[matches objectAtIndex:1] range]] intValue];
seconds = [[string substringWithRange:[[matches objectAtIndex:2] range]] intValue];
NSLog(@"degrees: %i, minutes: %i, seconds: %i", degrees, minutes, seconds);

NSLog 输出:

度:-7,分钟:12,秒:2

于 2012-01-23T21:31:09.083 回答