我有一个公共高分榜的游戏,我允许图层输入他们的名字(或任何东西到12个字符)。我正在尝试创建一些函数来过滤掉坏词列表中的坏词
我有一个文本文件。我有两种方法:
要在文本文件中阅读:
-(void) getTheBadWordsAndSaveForLater {
badWordsFilePath = [[NSBundle mainBundle] pathForResource:@"badwords" ofType:@"txt"];
badWordFile = [[NSString alloc] initWithContentsOfFile:badWordsFilePath encoding:NSUTF8StringEncoding error:nil];
badwords =[[NSArray alloc] initWithContentsOfFile:badWordFile];
badwords = [badWordFile componentsSeparatedByString:@"\n"];
NSLog(@"Number Of Words Found in file: %i",[badwords count]);
for (NSString* words in badwords) {
NSLog(@"Word in Array----- %@",words);
}
}
在我读到的列表中再次检查一个单词(NSString*)
:
-(NSString *) removeBadWords :(NSString *) string {
// If I hard code this line below, it works....
// *****************************************************************************
//badwords =[[NSMutableArray alloc] initWithObjects:@"shet",@"shat",@"shut",nil];
// *****************************************************************************
NSLog(@"checking: %@",string);
for (NSString* words in badwords) {
string = [string stringByReplacingOccurrencesOfString:words withString:@"-" options:NSCaseInsensitiveSearch range:NSMakeRange(0, string.length)];
NSLog(@"Word in Array: %@",words);
}
NSLog(@"Cleaned Word Returned: %@",string);
return string;
}
我遇到的问题是,当我将单词硬编码到一个数组中时(参见上面的注释),它就像一个魅力。但是当我使用我用第一种方法读入的数组时,它不起作用 - stringByReplacingOccurrencesOfString:words
似乎没有效果。我已经找到了日志,所以我可以看到这些单词是否正在通过,它们是......除非我硬进阵列,否则一行似乎看不到这些单词。
有什么建议吗?
答案 0 :(得分:4)
有几点想法:
您有两行:
badwords =[[NSArray alloc] initWithContentsOfFile:badWordFile];
badwords = [badWordFile componentsSeparatedByString:@"\n"];
如果你要用下一行的initWithContentsOfFile
替换它,那么componentsSeparatedByString
就没有意义了。另外,initWithContentsOfFile
假定文件是属性列表(plist),但代码的其余部分明确假定它是换行符分隔的文本文件。就个人而言,我会使用plist格式(它不需要修剪单个单词的空白),但你可以使用你喜欢的任何一种。但是使用其中一种,但不能两种都使用。
如果你继续使用新行分隔的坏词列表,那么只要删除那句话initWithContentsOfFile
,你无论如何都要忽略它的结果。因此:
- (void)getTheBadWordsAndSaveForLater {
// these should be local variables, so get rid of your instance variables of the same name
NSString *badWordsFilePath = [[NSBundle mainBundle] pathForResource:@"badwords" ofType:@"txt"];
NSString *badWordFile = [[NSString alloc] initWithContentsOfFile:badWordsFilePath encoding:NSUTF8StringEncoding error:nil];
// calculate `badwords` solely from `componentsSeparatedByString`, not `initWithContentsOfFile`
badwords = [badWordFile componentsSeparatedByString:@"\n"];
// confirm what we got
NSLog(@"Found %i words: %@", [badwords count], badwords);
}
您可能只想查找整个单词出现次数,而不仅仅是在任何地方出现坏单词:
- (NSString *) removeBadWords:(NSString *) string {
NSLog(@"checking: %@ for occurrences of these bad words: %@", string, badwords);
for (NSString* badword in badwords) {
NSString *searchString = [NSString stringWithFormat:@"\\b%@\\b", badword];
string = [string stringByReplacingOccurrencesOfString:searchString
withString:@"-"
options:NSCaseInsensitiveSearch | NSRegularExpressionSearch
range:NSMakeRange(0, string.length)];
}
NSLog(@"resulted in: %@", string);
return string;
}
这使用“正则表达式”搜索,其中\b
代表“单词之间的边界”。因此,\bhell\b
(或者,因为必须在NSString
字面值中引用反斜杠,@"\\bhell\\b"
)将搜索单词“hell”这个词,但不会例如,匹配“你好”。
注意,上面,我还记录badwords
以查看该变量是否以某种方式重置。鉴于您描述的症状,即从文本文件中加载错误的单词,但替换进程失败,这是唯一有意义的事情。因此,在替换之前检查badwords
并确保它仍然设置正确。