Как разделить строку с помощью регулярного выражения - PullRequest
1 голос
/ 02 июня 2019

Ниже приведен синтаксис Java: Code.split("(?<=\\D)(?=\\d)");

Я хочу преобразовать это в ios target c

строка код: LR00001 или BLNS-9-M

Я хочу O / p как:

  • если код LR00001, то массив дает мне два значения. По 0-му индексу он дает LR, а по 1-му - 00001

  • если код BLNS-9-M, то Array [0] BLNS и Array [1] 9-M

Это o / p работает в Java, но требуется в цели ios c.

Это регулярное выражение: (?<=\\D)(?=\\d) означает, что оно находит позицию в строке, где перед этой позицией стоит нецифровый (\D) символ, а после нее - цифра (\d). т.е. соответствует позиции между нецифровой (\D) и цифрой (\d).

Следующий код, который я пробовал:

1

NSArray *arrComponents = [strCode componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"(?<=\\D)(?=\\d)"]];

2

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=\\D)(?=\\d)" options:0 error:&error];
NSArray* matches = [regex matchesInString:strCode options:0 range:NSMakeRange(0, [strStyleCode length])];
NSTextCheckingResult *match = [regex firstMatchInString:strCode options:0 range: NSMakeRange(0, [strStyleCode length])];
NSLog(@"group1: %@", [strCode substringWithRange:[match rangeAtIndex:0]]);
NSLog(@"group2: %@", [strCode substringWithRange:[match rangeAtIndex:1]]);

3.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"(?<=\\D)(?=\\d)"];

Все вышеперечисленное не работает.

Я хочу такой же вывод в ios target c.

[LR, 00001] [BLNS, 9-М] * * 1 044

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Вы можете сначала заменить все совпадения неиспользуемым символом, скажем, на \x00 null char, а затем разделить его:

NSError *error = nil;
NSString *str = @"LR00001";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=\\D)(?=\\d)" options:nil error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:str options:0 range:NSMakeRange(0, [str length]) withTemplate:@"\x00"];
NSArray *chunks = [modifiedString componentsSeparatedByString: @"\x00"];
for(NSString *c in chunks) {
    NSLog(@"%@", c);
}

Он печатает LR и 00001.

См. Онлайн-демонстрацию .

1 голос
/ 03 июня 2019

Java String.split использует регулярное выражение для соответствия разделителю, возможно, нулевой длины, при котором строка должна быть разделена.Затем он извлекает части строки до и после сопоставления, он не извлекает ничего, что соответствует RE.

В Objective-C есть методы для разделения строки, componentsSeparatedBy..., но ни один из них не требуетрегулярное выражение.Ваша первая попытка попытаться использовать один из них, определив набор символов с помощью вашего регулярного выражения - однако вы не можете определить набор символов таким образом, и даже если вы могли бы, набор символов в вашем конкретном разделителе пуст.

Ваша третья попытка не завершена, поэтому мы пропустим это.

Теперь ваша вторая попытка находит разделитель, используя firstMatchInString:, но обнаружив, что он не пытается извлечь строки до и после этого разделителя, т.е.не выполнить фактическое разделение.Если вы сделаете это, у вас есть создание Objective-C, эквивалентное Java-расщеплению.

В общих чертах:

  1. Используйте firstMatchInString:, чтобы найти первый разделитель в вашей строке
  2. Если совпадение не удалось, вы закончили, добавьте оставшуюся строку в вашу коллекцию компонентов и верните.
  3. Если совпадение выполнено успешно, то:
    1. извлеките подстроку до началасоответствия разделителя - часть результата firstMatchInString: представляет собой NSRange, который содержит начальный индекс, а NSString имеет методы для извлечения подстрок на основе индексов.
    2. извлекает подстроку после разделителяmatch - аналогично вышеописанному, но не забудьте учесть длину соответствия при расчете индекса, где начинается эта подстрока
    3. , теперь вам нужно разделить эту вторую подстроку, поэтому вернитесь к шагу 1 и повторите процесс, используяэту подстроку.

Вы можете кодировать вышеприведенное как простой цикл while в Objective-C.

Если при попытке реализоватьЕсли вы застряли в этом алгоритме, задайте новый вопрос, покажите код, объясните свою проблему, добавьте ссылку на этот вопрос, и кто-то, несомненно, поможет вам.

HTH

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