Regex stringByReplacingMatchesInString (замена пробелов в строке в кавычках) - PullRequest
0 голосов
/ 08 июня 2018

Контекст является приложением IOS.Я хотел бы заменить пробелы, заключенные в квадратные скобки.

ex:

Тото "это Билл" должно стать Тото "это # ​​Билл"

Погода "яркая иясно "должно стать" погода "ясная # и # ясная"

Я провел испытания, используя следующий код, основанный на другом сообщении

NSString *pattern   = @"(?:(?<=^\")(\\s+))|(?:(?!^\")(\\s+)(?=.))|(?:(\\s+)(?=\"$))";  // (?:(?<=^")(\s+))|(?:(?!^")(\s+)(?=.))|(?:(\s+)(?="$))

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];

NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"#"];
NSLog(@"modified %@", modifiedString);

Но этоне работает правильно.

заменены все пробелы (Toto # "is # Bill")

Я получаю тот же результат только с (?: (?! ^ ") (\ s +) (? =.))

Я сделал один самостоятельно (?: \ "\ S *) (\ s) (?: \ S *), что не в порядке ни

Iбуду признателен за помощь в этом!Спасибо

1 Ответ

0 голосов
/ 10 июня 2018

Вот решение, которое я использую.Это, вероятно, не идеально, но это работает для моих нужд.

Как отметил Виктор Стрибьев, моя проблема в том, что первый и последний символы моего образца - это один и тот же персонаж "Он предложил мне решение, которое янайти излишнее, но это необходимо, потому что в Objective C. нет функции обратного вызова.

В качестве альтернативы, вот как я решил свою проблему (заменив пробелы в строках в кавычках строки поиска):

1) Я добавляю пробел в конце строки "окна поиска"

NSString * searchstring1 = [searchString stringByAppendingString:@" "];

2) Я использую следующее регулярное выражение для замены пробелов (?: (? <= "^"])(? = \ w) | [^ \ S "]) (? = [^"] <em>"\ s )

        NSString *pattern   = @"(?:(?<=\"^\"])(?=\\w)|[^\\S\"])(?=[^\"]*\"\\s* )";  // (?:(?<="^"])(?=\w)|[^\S"])(?=[^"]*"\s* )
        NSError *error = nil;
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
        NSString *searchstring2 = [regex stringByReplacingMatchesInString:searchstring1 options:0 range:NSMakeRange(0, [searchstring1 length]) withTemplate:@"xxx"];
        NSLog(@"modified %@", searchstring2);

3) Я выделяю все токены для поиска (* разделены пробелами)

NSMutableArray *words = (NSMutableArray *)[searchstring2 componentsSeparatedByString:@" "];

4) восстановить пробелы в цитируемых строках и удалить кавычки

NSString *token;


    for(token in words)
    {

    token = [token stringByReplacingOccurrencesOfString:@"xxx" withString:@" "];
    token = [token stringByReplacingOccurrencesOfString:@"\"" withString:@""];
    NSLog(@"token %@\n", token);
    }

следующая строка поиска: Билл "погода ясная" классно выдаст следующий вывод

жетон Билл

жетон погода яркая

токен классный

Надеюсь, это поможет другим.

...