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

dre*_*ves 3 regex cocoa command-line parsing objective-c

这是一段代码,用于获取input表示命令行的字符串(NSString或NSAttributedString),并将其解析为两个字符串,即命令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 = @"";
Run Code Online (Sandbox Code Playgroud)

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

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

补充:我相信上面的代码有一点是正确的,到目前为止答案不是args不应该有任何初始空格.

Chu*_*uck 10

NSString *cmd;
NSScanner *scanner = [NSScanner scannerWithString:[inStr string]];
[scanner scanUpToCharactersFromSet:[NSCharacterSet
                                    whitespaceAndNewlineCharacterSet] 
                        intoString:&cmd];
NSString *args = [[scanner string] substringFromIndex:[scanner scanLocation]];
Run Code Online (Sandbox Code Playgroud)

您的自动释放是正常的,但首先分配字符串是不必要的,因为NSScanner通过引用返回一个新字符串.由于NSScanner的charactersToBeSkipped默认包含空格,因此不应该被初始空格绊倒.


Zac*_*ley 5

像这样的东西?

int index = [input rangeOfString:@" "].location;
NSString *cmd = [input substringToIndex:index]);
NSString *args = [input substringFromIndex:index + 1]);
Run Code Online (Sandbox Code Playgroud)