我对Cocoa编程还很陌生,所以我很努力地创建一个程序,该程序将让用户在文本字段中输入文本,然后按一个按钮。当按下按钮时,该文本应将某些子字符串替换为某些字符。子字符串的长度都不超过2个字符,尽管有些子字符串的长度为单个字符。替换完成后,新获取的文本将被放置到另一个文本字段中。
子串替换的示例可以是:应该将“ n”更改为“ 5”,应该将“ nj”更改为“ g”,将“ ng”更改为“ s”。因此,文字“立即注射注射器!” 将更改为“触发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
并且output
为NSTextField
。
我想您可以通过许多不同的方法来实现所需的功能。这是一个简单的例子:
可能是这样的:
#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));
}
}
会产生:
输出:连接syrise 5ow!
注意:(显然)这是一种过于简化的方法,可以实现所需的功能,可能需要进行一些调整以涵盖每种情况,但它比您的版本更简单,希望对您有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句