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

2023-12-08

我有一个带有公共高分列表的游戏,我允许图层输入他们的名称(或任何最多 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. 你有两行:

    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”,它是一个单独的单词,但不会匹配“hello”,例如。

  3. 注意,上面,我也在记录badwords查看该变量是否以某种方式重置。考虑到您所描述的症状,这是唯一有意义的事情,即从文本文件加载坏词有效,但替换过程失败。所以检查badwords更换之前请确保其设置正确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Objective-C 中替换字符串中的坏词 的相关文章

随机推荐

  • 锁定 Android 手机 [重复]

    这个问题在这里已经有答案了 可能的重复 以编程方式锁定 Android 设备 我希望在运行方法时能够使用密码锁定 Android 手机 有谁有参考资料或示例代码供我参考 谢谢 EDIT我尝试过使用 KeyguardManager mgr K
  • 登录失败:用户名未知或密码错误。访问其他服务器时出错

    我正在使用登录凭据访问其他服务器 我的问题是 如果我最初运行代码 它会将错误显示为 Logon failure unknown user name or bad password 但是如果我尝试通过命令提示符连接到服务器一次后运行代码 然后
  • JavaScript 按位掩码

    这个问题类似于这另一个问题 但是 我想了解为什么会这样 下面的代码 console log parseInt 0xdeadbeef 16 parseInt 0x000000ff 16 toString 16 console log pars
  • Python 3.7.3 无意中安装在 Mac OS 10.15.1 上 - 现在包含在 Xcode Developer Tools 11.2 中?

    我昨天决定对 Mac 操作系统进行全新安装 例如 擦除整个磁盘并重新安装操作系统 我使用的是 Macbook Air 2018 我全新安装了 Mac OS 10 15 1 由于我之前的 Python 环境非常混乱 所以我进行了全新安装 我希
  • python 中的批量字符串替换?

    假设我有一个如下所示的字符串 str The yquick cbrown bfox Yjumps over the ulazy dog 您会注意到字符串中的很多位置都有一个 符号 后跟一个字符 例如 y 和 c 我需要用字典中的适当值替换这
  • json.org 上使用的生成铁路图的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我喜欢的语法铁路图 on json org这是 BNF 语言的图形表示 我还没有找到任何工具可以产生如此雄辩的结果 任何人都可以识别用于生成这些图表
  • Chrome 不会删除会话 cookie

    我正在尝试在 javascript 中设置会话 cookie 如下所示 document cookie name alex path 但即使我退出浏览器并再次启动 Chrome 也不会删除它 我检查了 Firefox 和 Opera 它们都
  • Django 1.2 会话丢失

    我以前问过类似的问题 但我做了更多研究 这次迭代应该有点不同 似乎有几个 SO 用户在单个视图中注册和登录用户时遇到了问题 但还没有真正得到解决 问题是我在单个 Django 视图中注册 验证和登录用户 对于大多数用户来说这很好 但对于其他
  • 如何调试涉及 Classes.pas 中 ThreadProc 崩溃的设计时包卸载崩溃?

    我不确定如何追踪以下崩溃 当卸载我公司内部使用的设计时包时会发生这种情况 这是我们的代码 因此这是我们要修复的错误 而不是第三方组件供应商的问题 似乎涉及到一个线程 但由于它发生在 Classes pas 中的 Function Threa
  • 使用 pyodbc 在 Access 中处理日期时出现“参数太少”错误

    我正在使用带有 pyodbc 导入的 Python 我使用的是 Microsoft Office 2013 64 位 我正在尝试查询 accdb 数据库以选择范围内的不同日期并将它们分配给游标 以便我可以将它们附加到列表中 我的 Acces
  • 正则表达式从字符捕获到第一个句点

    我的正则表达式字符串看起来像 您的订单 Q 111 111 1111 账单金额为 100 50 美元 如何提取订单号 即 和第一个 之间的字符串 Q 111 111 1111 我试过了 但它正在捕获最后一个点字符 我确信 我需要使用非贪婪匹
  • Linux 是否对页目录和页表使用自映射?

    我只是问这个问题 因为我很好奇 Linux 内核是如何工作的 根据http i web i u tokyo ac jp edu training ss lecture new documents Lectures 02 VirtualMem
  • 是/否消息框始终返回是 - VB.Net

    我正在尝试消息框 并尝试了一个简单的是 否消息框 所以我写了这段简单的代码 但是 无论我按下哪个按钮 chc 变量始终返回为 1 我提供了代码 所以你可能会看到我做错了什么 这可能是严重错误的 If MsgBoxResult Yes The
  • 将多个类绑定到单个变量

    在使用 Tailwind 和实用程序优先的 css 方法时 我经常发现需要将多个类绑定到单个变量 例如 要设置输入表单的样式 我需要添加border red color red等 如果有错误 在 Vue 中是否有一种漂亮而优雅的方式来表达这
  • 仅使用 javascript 在服务器上读取/写入 txt 文件,而不涉及任何服务器端语言

    我正在开发一个简单的 HTML Javascript 应用程序 该应用程序在文本区域中向用户显示一条随机文本消息 我有15 20条这样的短信 最多500个字符 我不想将这些消息保存在数据库中 我有两种情况 我每条消息都有多个 txt 文件
  • 每当声明停止请求时,HasAnyAuthority 总是让我进入 api

    通过 Spring Security 我创建了一个方法 Configuration EnableWebSecurity EnableGlobalMethodSecurity securedEnabled true public class
  • 使用 cmake 从 llvm 源目录开发 llvm 通道

    我正在尝试在我的项目目录下开发 llvm pass 为此 我遵循中的信息http llvm org docs CMake html developing llvm pass out of source 我按照此链接适当地创建了我的 CMak
  • RegEx 在 Javascript 中获取字符串后的 URL 部分

    我有以下网址 http data test com api v1 entity 1231 我需要获取后面的文本v1 和之前 斜线之间 在本例中为单词entity 我正在使用以下正则表达式 但我得到的是entity 1231第 1 组 v1
  • Java 1.5 中的 JTable 对行进行排序

    有没有一种简单的方法可以使用 Java 1 5 对 JTable 中的行进行排序 setAutoCreateRowSorter and TableRowSorter似乎是 Java 1 6 功能 Java 1 5 中的排序只能通过库实现 例
  • 在 Objective-C 中替换字符串中的坏词

    我有一个带有公共高分列表的游戏 我允许图层输入他们的名称 或任何最多 12 个字符的名称 我正在尝试创建几个函数来从坏词列表中过滤掉坏词 我有一个文本文件 我有两种方法 读取文本文件之一 void getTheBadWordsAndSave