替换Objective-C中字符串中的坏词

时间:2013-11-29 16:10:41

标签: objective-c file nsstring

我有一个公共高分榜的游戏,我允许图层输入他们的名字(或任何东西到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似乎没有效果。我已经找到了日志,所以我可以看到这些单词是否正在通过,它们是......除非我硬进阵列,否则一行似乎看不到这些单词。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

有几点想法:

  1. 您有两行:

    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);
    }
    
  2. 您可能只想查找整个单词出现次数,而不仅仅是在任何地方出现坏单词:

    - (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”这个词,但不会例如,匹配“你好”。

  3. 注意,上面,我还记录badwords以查看该变量是否以某种方式重置。鉴于您描述的症状,即从文本文件中加载错误的单词,但替换进程失败,这是唯一有意义的事情。因此,在替换之前检查badwords并确保它仍然设置正确。