iOS NSRegularExpression текста - PullRequest
       33

iOS NSRegularExpression текста

0 голосов
/ 07 февраля 2020

У меня есть этот текст

1111222233334444

И мне нужно получить этот результат

1111 2222 3333 4444

Пожалуйста, дайте мне формулу NSRegularExpression.

1 Ответ

1 голос
/ 08 февраля 2020

Шаблон регулярного выражения может выглядеть примерно так:

^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$

^ соответствует началу строки, каждый [0-9]{4} находит последовательность из четырех цифр, ( и ) «захватывают» эти группы цифр как отдельные диапазоны, а $ соответствует концу строки.

Таким образом, с NSRegularExpression это может быть что-то вроде:

- (NSString *)formatCreditCard:(NSString *)string {
    NSError *error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$" options:kNilOptions error:&error];
    if (error) {
        NSLog(@"error: %@", error);
        return nil;
    }

    NSRange range = NSMakeRange(0, string.length);
    NSTextCheckingResult *match = [regex firstMatchInString:string options:kNilOptions range:range];

    if (!match) {
        return nil;
    }

    NSMutableArray <NSString *>*results = [[NSMutableArray alloc] init];
    for (NSInteger index = 1; index <= regex.numberOfCaptureGroups; index++) {
        NSRange range = [match rangeAtIndex:index];
        [results addObject:[string substringWithRange:range]];
    }

    return [results componentsJoinedByString:@" "];
}

Но вам не нужно входить в NSRegularExpression, если вы не хотите. Вы можете использовать stringByReplacingOccurrencesOfString:withString:options:range:, с опцией NSRegularExpressionSearch:

- (NSString *)formatCreditCard:(NSString *)string {
    NSRange range = NSMakeRange(0, string.length);
    return [string stringByReplacingOccurrencesOfString:@"^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$"
                                             withString:@"$1 $2 $3 $4"
                                                options:NSRegularExpressionSearch
                                                  range:range];
}

FWIW, исполнение Swift может выглядеть так:

func format(creditCardNumber string: String) -> String? {
    guard
        let regex = try? NSRegularExpression(pattern: "^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$"),
        let match = regex.firstMatch(in: string, range: NSRange(string.startIndex..., in: string)),
        match.numberOfRanges > 1
    else {
        return nil
    }

    return (1..<match.numberOfRanges)
        .compactMap { Range(match.range(at: $0), in: string) }
        .map { string[$0] }
        .joined(separator: " ")
}

или

func format(creditCardNumber string: String) -> String {
    string.replacingOccurrences(of: "^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$",
                                with: "$1 $2 $3 $4",
                                options: .regularExpression)
}

Выше я предположил, что это номер кредитной карты, который вы хотите отформатировать, но если это так, учтите, что этого простого формата XXXX XXXX XXXX XXXX недостаточно , Не все номера кредитных карт форматируются таким образом (например, американские Express номера XXXX XXXXXX XXXXX).

Существует множество различных форматов и длин номеров кредитных карт (см. Номер платежной карты ). Возможно, вы захотите просто найти библиотеку, которая избавит вас от этого. См. Форматирование UITextField для ввода кредитной карты, например (xxxx xxxx xxxx xxxx) для получения дополнительной информации или поиска в Интернете «iOS форматирование кредитной карты».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...