如何 remove/replace 从 'dynamic' regex/string 到 ruby 的特殊字符?

How to remove/replace specials characters from a 'dynamic' regex/string on ruby?

所以我已经让这段代码工作了几个月,假设我有一个名为 Categories 的 table,它有一个名为 [=23= 的字符串列]name,所以我收到一个 string,我想知道是否提到了任何类别(当字符串包含子字符串时会出现提及:@name_of_a_category),我遵循的方法如下所示:

categories.select { |category_i| content_received.downcase.match(/@#{category_i.downcase}/)}

直到今天突然开始收到异常unmatched close parenthesis之前一直很好用,我意识到类别名称可以包含特殊字符所以我决定不再考虑特殊字符或空格(不想对用户添加限制,同时又不想处理这些情况,因此政策只是忽略它)。

所以问题是有一个干净的方法来删除这些特殊字符(保持 @)并匹配字符串(不想修改数据只是忽略它而寻找提及)?

所以在环顾四周后,我在平台上找到了一些答案,但没有符合我的具体要求(也许我遗漏了什么,如果有请告诉我),这就是我针对我的情况修复它的方法:

content_received = 'pepe is watching a @comedy :)'

categories = ['comedy :)', 'terror']

temp_content = content_received.downcase

categories.select { |category_i| temp_content.gsub(/[^\sa-zA-Z0-9]/, '@' => '@').match?(/@#{category_i.downcase.
        gsub(/[^\sa-zA-Z0-9]/, '')}/) }

为了示例,我将类别简化为一个简单的字符串数组,基本上是第一个 gsub,删除任何不是字母或数字的字符(任何特殊字符)并替换每个 @ 都有一个 @,第二个 gsub 是第一个的简单版本。

您可以测试上面的代码段 here

您也可以使用

prep_content_received = content_received.gsub(/[^\w\s]|_/,'')
p categories.select { |c| 
  prep_content_received.match?(/\b#{c.gsub(/[^\w\s]|_/, '').strip()}\b/i) 
}

Ruby demo

详情:

  • prep_content_received = content_received.gsub(/[^\w\s]|_/,'') 创建了一个没有特殊字符的 content_received_ 的副本。如果有很多类别,使用它一次可以减少开销
  • 然后,您遍历 categories 列表,每次检查 prep_content_received 是否与 \b(单词边界)+ 包含所有特殊字符的类别匹配,_ 和 leading/trailing 以不区分大小写的方式从它 + \b 中剥离空格(参见 /i 标志,不需要 .downcase)。