Objective c Objective-NSC字符串字符替换
我有一个NSString类别,我正在进行类似于PHP的strtr的字符替换。此方法获取一个字符串,并替换Objective c Objective-NSC字符串字符替换,objective-c,string,character,substitution,strtr,Objective C,String,Character,Substitution,Strtr,我有一个NSString类别,我正在进行类似于PHP的strtr的字符替换。此方法获取一个字符串,并替换fromString中出现的每个字符,并将其替换为toString中具有相同索引的字符。我有一个工作方法,但它不是很好的性能,并希望使它更快,能够处理兆字节的数据 编辑(为清晰起见): stringByReplacingOccurrencesOfString:withString:options:range:将不起作用。我必须使用像“ABC”这样的字符串,在用“B”替换“a”和用“a”替换“B
fromString
中出现的每个字符,并将其替换为toString
中具有相同索引的字符。我有一个工作方法,但它不是很好的性能,并希望使它更快,能够处理兆字节的数据
编辑(为清晰起见):
stringByReplacingOccurrencesOfString:withString:options:range:
将不起作用。我必须使用像“ABC”这样的字符串,在用“B”替换“a”和用“a”替换“B”之后,最后用“BAC”结束。连续调用stringByReplacingOccurrencesOfString:withString:options:range:
将生成类似“AAC”的字符串,这是不正确的
建议将是伟大的,样本代码将更好
代码:
-(NSString*)stringbysubstitutioncharactersfromstring:(NSString*)fromString
toString:(NSString*)toString;
{
NSMutableString*substitutedString=[self-mutableCopy];
NSString*aCharacterString;
NSU整数特征索引
,stringLength=替换的String.length;
对于(整数i=0;i
此外,在文本视图中对文本的每次更改后都会执行此代码。每次都会传递整个字符串。我知道有更好的办法,但我不知道怎么做。如果您对此有任何建议,我们将不胜感激 您可以通过修改可变字符串或创建新的不可变字符串来进行这种字符串替换。它可以使用任意两个要替换的字符串(即使它们是多个符号),但您需要转义正则表达式中表示某种内容的任何字符(如
\[(.++
等)
该模式找到两个子字符串中介于和之间的可选“anything”,然后将它们替换为两个子字符串,并相互保留它们之间的可选字符串
// These string can be of any length
NSString *firstString = @"Axa";
NSString *secondString = @"By";
// Escaping of characters used in regular expressions has NOT been done here
NSString *pattern = [NSString stringWithFormat:@"(%@|%@)(.*?)(%@|%@)", firstString, secondString, firstString, secondString];
NSString *string = @"AxaByCAxaCBy";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionCaseInsensitive
error:&error];
if (error) {
// Insert error handling here...
}
NSString *modifiedString = [regex stringByReplacingMatchesInString:string
options:0
range:NSMakeRange(0, [string length])
withTemplate:@"$3$2$1"];
NSLog(@"Before:\t%@", string); // AxaByCAxaCBy
NSLog(@"After: \t%@", modifiedString); // ByAxaCByCAxa
看起来很有希望。我会看看是否可以对它进行逐个字符的替换。我尝试了尽我所能让它用于逐个字符的替换,但没有任何效果。如果有帮助,一个字符只能替换为一个,而不是多个。难道你不能让
fromString
成为firstString
和toString
吗>如果您的方法看起来仍然像问题中的方法,则返回secondString
并返回modifiedString
。
// These string can be of any length
NSString *firstString = @"Axa";
NSString *secondString = @"By";
// Escaping of characters used in regular expressions has NOT been done here
NSString *pattern = [NSString stringWithFormat:@"(%@|%@)(.*?)(%@|%@)", firstString, secondString, firstString, secondString];
NSString *string = @"AxaByCAxaCBy";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionCaseInsensitive
error:&error];
if (error) {
// Insert error handling here...
}
NSString *modifiedString = [regex stringByReplacingMatchesInString:string
options:0
range:NSMakeRange(0, [string length])
withTemplate:@"$3$2$1"];
NSLog(@"Before:\t%@", string); // AxaByCAxaCBy
NSLog(@"After: \t%@", modifiedString); // ByAxaCByCAxa