Luk*_*ela 1 regex replace objective-c ios nsregularexpression
在objective-c(for ios)中,我希望在AS3中实现相同的目标:
var test:String = "Abba";
var reg:RegExp = /(a)|(b)/g;
var replacement:Function = function (...args):String
{
var $1:String = args[1];//matched 'a'
var $2:String = args[2];//matched 'b'
if($1)
{
//replace a with -
return "-";
}
if ($2)
{
//replace b with +
return "+";
}
return null;
}
var result:String = test.replace(reg, replacement);//A++-
trace(test, result);//Abba A++-
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望能够识别匹配的匹配组并相应地替换它,我正在寻找enumerateMatchesInString的示例:但找不到任何可以解决我的问题的东西.
enumerateMatchesInString:NSTextCheckingResult为每个匹配调用一个块,并rangeAtIndex:idx给出捕获的子组的范围:
NSString *string = @"Abba";
NSString *pattern = @"(a)|(b)";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:0
error:NULL];
NSMutableString *newString = [string mutableCopy];
[regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSRange r1 = [result rangeAtIndex:1];
if (r1.location != NSNotFound) {
[newString replaceCharactersInRange:r1 withString:@"-"];
}
NSRange r2 = [result rangeAtIndex:2];
if (r2.location != NSNotFound) {
[newString replaceCharactersInRange:r2 withString:@"+"];
}
}];
NSLog(@"%@", newString);
// Output: A++-
Run Code Online (Sandbox Code Playgroud)
如果替换字符串的长度与原始字符串的长度不同,那么它会稍微复杂一些,因为您必须跟踪结果字符串中的长度变化:
NSMutableString *newString = [string mutableCopy];
__block int offset = 0;
[regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSRange r1 = [result rangeAtIndex:1];
if (r1.location != NSNotFound) {
r1.location += offset;
NSString *repl = @"---";
[newString replaceCharactersInRange:r1 withString:repl];
offset += [repl length] - r1.length;
}
NSRange r2 = [result rangeAtIndex:2];
if (r2.location != NSNotFound) {
r2.location += offset;
NSString *repl = @"++";
[newString replaceCharactersInRange:r2 withString:repl];
offset += [repl length] - r2.length;
}
}];
NSLog(@"%@", newString);
// Output: A++++---
Run Code Online (Sandbox Code Playgroud)