我对Cocoa编程很陌生,我最擅长创建一个程序,将用户输入文本放入文本字段,然后按一个按钮。按下按钮时,文本应该将某些子串替换为某些字符。所有子串都不超过2个字符,但有些字符长度为单个字符。更换完成后,新获取的文本将被放入另一个文本域。
子串替换的示例可以是“n”应该被改变为“5”,“nj”应该被改变为“g”并且“ng”将被改变为“s”。所以文本“现在注射注射器!”将改为“Igect the syrise 5ow!”
如何以简单而优雅的方式实现这一目标?我尝试了以下代码,但它似乎不起作用。
- (IBAction)convert:(id)sender {
NSMutableString *x;
[x setString:[self.input stringValue]];
NSMutableString *output1;
[output1 setString:@""];
NSMutableString *middle;
middle = [[NSMutableString alloc] init];
int s;
unsigned long length = [x length];
for (s = 0; s < length; s = s + 1) {
if (s + 2 <= length) { // if more than or equal to two characters left
[middle setString:[x substringWithRange:NSMakeRange(s, 2)]];
if ([middle isEqualToString:@"nj"]) {
[output1 appendToString:@"g"];
s = s+1;
} else if ([middle isEqualToString:@"ng"]) {
[output1 appendToString:@"s"];
s = s+1;
} else { // if no two-character sequence matched
[middle setString:[x substringWithRange:NSMakeRange(s, 1)]];
if ([middle isEqualToString:@"n"]) {
[output1 appendString:@"5"];
}
}
} else { // if less than two characters left
[middle setString:[x substringWithRange:NSMakeRange(s, 1)]];
if ([middle isEqualToString:@"n"]) {
[output1 appendString:@"5"];
}
}
}
[self.output setStringValue:output1];
}
此处,*x
是来自input
的文字,*output1
是存储结果的位置,*middle
是由正在测试的文本组成的,input
{1}}和output
是NSTextField
s。
答案 0 :(得分:0)
我猜你可以通过不同的方法实现你想要的效果。这是一个简单的:
或许这样的事情:
#import <Foundation/Foundation.h>
NSString * matchAndReplace(NSString *input, NSDictionary *map){
NSMutableString *_input = [input mutableCopy];
// Get all keys sorted by greatest length
NSArray *keys = [map.allKeys sortedArrayUsingComparator: ^(NSString *key1, NSString *key2) {
return [@(key2.length) compare:@(key1.length)];
}];
for (NSString *key in keys) {
[_input replaceOccurrencesOfString:key
withString:map[key]
options:NSLiteralSearch
range:NSMakeRange(0,_input.length)];
}
return [_input copy];
};
int main(int argc, char *argv[]) {
@autoreleasepool {
NSDictionary *mapping = @{
@"n": @"5",
@"nj": @"g",
@"ng": @"s"
};
NSString *input = @"Inject the syringe now!";
NSLog(@"Output: %@", matchAndReplace(input, mapping));
}
}
将产生:
输出:Igect syrise 5ow!
注意:这是一种过于简化的方式来实现您想要的(显然)并且可能需要进行一些调整以涵盖每个边缘情况,但它比您的版本更简单,我希望这将有助于你。