[英]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.