繁体   English   中英

Cocoa / Objective-C中的简单字符串解析:将命令行解析为命令和参数

[英]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 = @"";

这似乎有效,但魔术字符串是一个非常荒谬的黑客。 而且,我完全不确定我是否正确使用自动释放功能。

补充:解决方案对初始空格也应该是健壮的。 另外,我最初的输入字符串同时叫做inputinStr 对不起,这个混乱。

补充:我相信上面的代码有一点是正确的,到目前为止答案不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM