如何使用正则表达式拆分字符串 ios objective c
How to Split String With Regular Expression ios objectivec
下面是 Java 的语法:Code.split("(?<=\D)(?=\d)");
我想在 ios objective 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 objective 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 objective c.
中的相同输出
[LR,00001]
[BLNS,9-M]
Java 的 String.split
使用正则表达式来匹配分隔符,可能是 zero-length,字符串应该在此处拆分。然后它提取匹配前后的字符串部分,它不提取 RE 匹配的任何内容。
Objective-C有分割字符串的方法,componentsSeparatedBy...
,但其中none采用正则表达式。您的第一次尝试通过使用正则表达式定义字符集来尝试使用其中一个字符集——但是您不能以这种方式定义字符集,即使您可以,特定分隔符中的字符集也是空的。
您的第三次尝试未完成,因此我们将跳过它。
现在您的第二次尝试使用 firstMatchInString:
定位定界符,但发现它不会尝试提取该定界符前后的字符串,即您没有执行实际的拆分。如果你这样做,你就有了 Objective-C 等同于 Java 分裂的条件。
大纲:
- 使用
firstMatchInString:
定位字符串中的第一个分隔符
- 如果匹配失败您已经完成,请将剩余的字符串添加到您的组件集合中并 return。
- 如果匹配成功则:
- 将子字符串提取到分隔符匹配的开头 -
firstMatchInString:
的部分结果是一个 NSRange
,它包含一个起始索引,而 NSString
有方法来根据索引提取子字符串。
- 提取定界符匹配后的子串——与上述类似,但记住在计算该子串开始的索引时考虑匹配的长度
- 您现在需要拆分第二个子字符串,因此返回步骤 1 并使用此子字符串重复该过程。
您可以将以上代码编码为 Objective-C 中的简单 while
循环。
如果在尝试实现此算法时遇到困难,请提出一个新问题,展示您的代码,解释您的问题,并在 link 中回复此问题,毫无疑问有人会帮助您。
HTH
您可以先用 non-used 符号替换所有匹配项,例如 \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);
}
它打印 LR
和 00001
。
参见online demo。
下面是 Java 的语法:Code.split("(?<=\D)(?=\d)");
我想在 ios objective 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 objective 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 objective c.
中的相同输出[LR,00001] [BLNS,9-M]
Java 的 String.split
使用正则表达式来匹配分隔符,可能是 zero-length,字符串应该在此处拆分。然后它提取匹配前后的字符串部分,它不提取 RE 匹配的任何内容。
Objective-C有分割字符串的方法,componentsSeparatedBy...
,但其中none采用正则表达式。您的第一次尝试通过使用正则表达式定义字符集来尝试使用其中一个字符集——但是您不能以这种方式定义字符集,即使您可以,特定分隔符中的字符集也是空的。
您的第三次尝试未完成,因此我们将跳过它。
现在您的第二次尝试使用 firstMatchInString:
定位定界符,但发现它不会尝试提取该定界符前后的字符串,即您没有执行实际的拆分。如果你这样做,你就有了 Objective-C 等同于 Java 分裂的条件。
大纲:
- 使用
firstMatchInString:
定位字符串中的第一个分隔符 - 如果匹配失败您已经完成,请将剩余的字符串添加到您的组件集合中并 return。
- 如果匹配成功则:
- 将子字符串提取到分隔符匹配的开头 -
firstMatchInString:
的部分结果是一个NSRange
,它包含一个起始索引,而NSString
有方法来根据索引提取子字符串。 - 提取定界符匹配后的子串——与上述类似,但记住在计算该子串开始的索引时考虑匹配的长度
- 您现在需要拆分第二个子字符串,因此返回步骤 1 并使用此子字符串重复该过程。
- 将子字符串提取到分隔符匹配的开头 -
您可以将以上代码编码为 Objective-C 中的简单 while
循环。
如果在尝试实现此算法时遇到困难,请提出一个新问题,展示您的代码,解释您的问题,并在 link 中回复此问题,毫无疑问有人会帮助您。
HTH
您可以先用 non-used 符号替换所有匹配项,例如 \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);
}
它打印 LR
和 00001
。
参见online demo。