[英]Simple string parsing in Cocoa / Objective-C: parsing a command line into command and arguments
这是一段代码,用于获取表示命令行的字符串(NSString或NSAttributedString) input
,并将其解析为两个字符串,命令cmd
和参数args
:
NSString* cmd = [[input mutableCopy] autorelease];
NSString* args = [[input mutableCopy] autorelease];
NSScanner* scanner = [NSScanner scannerWithString:[input string]];
[scanner scanUpToCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet]
intoString:&cmd];
if (![scanner scanUpToString:@"magicstring666" intoString:&args]) args = @"";
这似乎有效,但魔术字符串是一个非常荒谬的黑客。 而且,我完全不确定我是否正确使用自动释放功能。
补充:解决方案对初始空格也应该是健壮的。 另外,我最初的输入字符串同时叫做input
和inStr
。 对不起,这个混乱。
补充:我相信上面的代码有一点是正确的,到目前为止答案不是args不应该有任何初始空格。
NSString *cmd;
NSScanner *scanner = [NSScanner scannerWithString:[inStr string]];
[scanner scanUpToCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet]
intoString:&cmd];
NSString *args = [[scanner string] substringFromIndex:[scanner scanLocation]];
您的自动释放是正常的,但首先分配字符串是不必要的,因为NSScanner通过引用返回一个新字符串。 由于NSScanner的charactersToBeSkipped默认包含空格,因此不应该被初始空格绊倒。
像这样的东西?
int index = [input rangeOfString:@" "].location;
NSString *cmd = [input substringToIndex:index]);
NSString *args = [input substringFromIndex:index + 1]);
您提到的自动释放实际上没有任何意义,您所做的只是创建一个可正确自动释放的可变副本(NSMutableString *),但是因为您将它转换为NSString *所以没有实际区别,只是说cmd = input;
。 即便如此,args也不需要,因为NSScanner会覆盖那里的东西。
rangeOfString:
可以工作,如果你想走这条路线你可以使用NSString的stringByTrimmingCharactersInSet
方法修剪前导空格(我也会测试以确保两个参数和命令都存在,否则你会得到一个错误)。 我会做的是使用NSString componentsSeparatedByCharactersInSet:
方法。 这将为您提供一个NSArray对象,其中包含命令和单独索引中的每个参数。
如果要将字符串扩展为完整的参数数组,例如“main”的输入,则可以使用wordexp。
#import <wordexp.h>
+ (NSMutableArray*) splitArgumentString:(NSString*)strArgs
{
wordexp_t expandedArgs;
NSMutableArray *argArray = [NSMutableArray array];
if(strArgs != nil && 0 == wordexp([strArgs UTF8String], &expandedArgs, 0))
{
for(size_t i = 0; i < expandedArgs.we_wordc; ++i)
{
NSString arg = [NSString stringWithCString:expandedArgs.we_wordv[i] encoding:NSUTF8StringEncoding];
[argArray addObject:arg];
}
wordfree(&expandedArgs);
}
return argArray;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.