如何使用正则表达式分割字符串

时间:2019-06-02 07:53:29

标签: ios objective-c nsregularexpression

以下是Java的语法:Code.split("(?<=\\D)(?=\\d)");

我想在ios目标c中进行转换

字符串代码:LR00001或BLNS-9-M

我希望O / p为:

  • 如果代码是LR00001,那么Array给我两个值。在第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目标c中的相同输出。

[LR,00001] [BLNS,9-M]

2 个答案:

答案 0 :(得分:2)

您可以先将所有匹配项替换为一个未使用的符号,例如,将其替换为\x00空字符,然后将其拆分:

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);
}

它打印LR00001

请参见online demo

答案 1 :(得分:1)

Java的String.split使用正则表达式来匹配分隔符(可能为零长度),应在该分隔符处拆分字符串。然后,它提取匹配前后的字符串部分,不提取与RE匹配的任何内容。

Objective-C具有用于分隔字符串componentsSeparatedBy...的方法,但是这些方法都不带正则表达式。您的第一次尝试是通过使用正则表达式定义一个字符集来尝试使用其中之一。但是,即使您可以将特定定界符中的字符集设为空,也无法以这种方式定义字符集。

您的第三次尝试未完成,因此我们将跳过它。

现在,您第二次尝试使用firstMatchInString:来定位定界符,但是发现它并没有尝试提取该定界符前后的字符串,即您没有执行实际的分割。如果这样做,您将获得与Java拆分相当的Objective-C。

概述:

  1. 使用firstMatchInString:查找字符串中的第一个定界符
  2. 如果匹配失败,则完成操作,将剩余的字符串添加到组件集合中并返回。
  3. 如果比赛成功,则:
    1. 提取子字符串直到定界符匹配的开始– firstMatchInString:结果的一部分是NSRange,其中包含起始索引,而NSString具有提取子字符串的方法基于索引。
    2. 在定界符匹配之后提取子字符串–与上面类似,但是在计算此子字符串开始的索引时,请记住允许匹配的长度
    3. 您现在需要拆分第二个子字符串,因此回到步骤1,并使用该子字符串重复该过程。

您可以在Objective-C中将以上代码编写为简单的while循环。

如果在尝试实现此算法时遇到麻烦,请提出一个新问题,显示您的代码,说明您的问题,包括指向该问题的链接,无疑会有人帮助您。

HTH