簡體   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