我有一个带有公开高分列表的游戏,我允许图层输入它们的名称(或任何不超过 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 似乎没有效果。我已经追踪到日志,所以我可以看到这些词是否通过,它们是......除非我硬核进入阵列,否则这一行似乎没有看到这些词。

有什么建议么?

最佳答案

一些想法:

  • 你有两行:
    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”,它是一个单独的单词,但不会匹配“hello”,例如。
  • 注意,上面,我还记录了 badwords 以查看该变量是否以某种方式重置。鉴于您描述的症状,这是唯一有意义的事情,即从文本文件中加载坏词有效但替换过程失败。因此,在替换之前检查 badwords 并确保它仍然设置正确。
  • 关于objective-c - 在 Objective-C 中替换字符串中的坏词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20289672/

    10-09 06:31