ruby 如何使用gsub删除返回字符串中的“/”和“/i”?

m3eecexj  于 2023-02-03  发布在  Ruby
关注(0)|答案(2)|浏览(129)

我有这句台词:msg = "Couldn't find column: #{missing_columns.map(&:inspect).join(',')}"
其输出:Couldn't find column: /firstname/i, /lastname/i
有没有一种方法可以使用gsub只返回列的名称,而不返回“/”和“/i”?或者有没有更好的方法?
我试过errors = msg.gsub(/\/|i/, ''),但是它返回的是第一个缺少的列“frstname”。

daupos2t

daupos2t1#

假定这些表达式看起来是不区分大小写的正则表达式

missing_columns 
#=> [/firstname/i,/lastname/i]

在这种情况下,您可以使用Regexp已经响应的方法,例如Regexp#source,而不是将它们转换为字符串并尝试从那里操作它们
Regexp#source- “返回模式的原始字符串。" 它不会返回文本边界(/)或选项(本例中为i

missing_columns.map(&:source).join(', ')
#=>  "firstname, lastname"
1zmg4dgp

1zmg4dgp2#

/\/|i/

让我们把它分解一下,外面的//是分隔符,有点像字符串的引号,所以实际的正则表达式在里面。

\/|i

\/表示匹配文字正斜杠。\防止它被解释为正则表达式的结尾。
i表示匹配一个字面量i。到目前为止还没有什么特别的。但是|是一个 * 交替 *。它表示匹配 * 左边的东西或右边的东西。实际上,这将从字符串中删除所有斜线 * 和 * i。您希望删除所有//i,但不能单独使用i。您仍然可以使用交替来完成此操作,前提是您在两侧都包含斜线。

/\/|\/i/

您还可以使用?修饰符更简洁地执行此操作,这使得它之前的内容是可选的。

/\/i?/

最后,您可以通过使用%r{...}正则表达式形式而不是/来避免/\/栅栏恶作剧。

%r{/i?}

总而言之,这是

errors = msg.gsub(%r{/i?}, '')

相关问题