簡體   English   中英

Objective-C 如何解析給定字符串中的類似命令行的參數?

[英]Objective-C how to parse command-line like arguments from a given string?

我正在使用 UISearchBar 處理 iOS 應用程序。 我想為用戶添加一個選項,以使用可以直接在搜索欄中輸入的輕量級搜索查詢,例如郵件應用程序。

例如,我希望能夠解析“Search Term last:week”並在我的數據中搜索“Search Term”並創建一個僅顯示過去 7 天的搜索過濾器。 如何解析來自 iOS String 的類似命令行的參數?

特別是,一旦我提取了我的令牌並驗證它們是有效的,我如何從搜索查詢中刪除它們而不影響查詢的其余部分?

這是我最初的嘗試。 是否有任何現成的工具可以用於此任務?

static NSString* whenKeyword = @"when";
static NSString* lastKeyword = @"last";

-(NSMutableDictionary*)findCommandsInQuery:(NSString*)query
{
    //extract keywords from the query, like google mail search. We want to have commands like "cute puppies Last:month"

//remove extra whitespace, prepare to parse
    NSString*  dirtyString = [query stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSArray* tokens = [dirtyString componentsSeparatedByString:@":"];

    //for each token, we want to trim it and remove illegal characters
    NSMutableArray* cleanTokens = [[NSMutableArray alloc] initWithCapacity:tokens.count];
    NSString* token = nil;
    NSString* nextToken = nil;

    NSString* cleanToken = nil;
    for(int i = 0; i< tokens.count; i ++)
    {
        //get a token, for example "cute puppies last"
        token = tokens[i];

        NSArray* words = [token componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        if(words.count >0)
        {
            for(NSString* word in words)
            {
                cleanToken = [DataSource cleanTrimSearchTerm:word];

                if(cleanToken.length > 0)
                {
                    [cleanTokens addObject:cleanToken];
                }
            }

        }else
        {
            cleanToken = nil;
        }



    }

    //process tokens
    NSMutableDictionary* commands = [NSMutableDictionary dictionary];

    for(int i = 0; i< cleanTokens.count; i ++)
    {
        token = cleanTokens[i];
        if(i+1 < cleanTokens.count)
        {
            nextToken = cleanTokens[i+1];
        }
        [self checkToken:token againstKeyword:whenKeyword withQuantifier:nextToken storeInDictionary:commands];
        [self checkToken:token againstKeyword:lastKeyword withQuantifier:nextToken storeInDictionary:commands];

    }
    DLog(@"found commands: %@",commands);
    return commands;
}

這是一種響應命令並使用它們創建搜索查詢的方法

-(void)processCommands:(NSMutableDictionary*)commands
{
    NSString* value = commands[lastKeyword];


    if(value != nil)
    {
        DLog(@"%@" ,value);
        if([value isEqualToString:@"day"])
        {

        }else if ([value isEqualToString:@"week"])
        {

        }else if ([value isEqualToString:@"month"])
        {

        }else if ([value isEqualToString:@"quarter"])
        {

        }else if ([value isEqualToString:@"year"])
        {

        }
    }
}

用戶通常不喜歡必須學習查詢語言。 這是一種復雜的用戶體驗。 有很多不同的方法可以簡化查詢和搜索,例如使用 UISearchController 的范圍欄或使用表視圖部分來划分信息。 但是,如果您仍然需要創建查詢機制,請嘗試實現您自己的抽象語法樹 (AST) 以避免意大利面條式代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM