我有这句台词: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”。
msg = "Couldn't find column: #{missing_columns.map(&:inspect).join(',')}"
Couldn't find column: /firstname/i, /lastname/i
errors = msg.gsub(/\/|i/, '')
daupos2t1#
假定这些表达式看起来是不区分大小写的正则表达式
missing_columns #=> [/firstname/i,/lastname/i]
在这种情况下,您可以使用Regexp已经响应的方法,例如Regexp#source,而不是将它们转换为字符串并尝试从那里操作它们Regexp#source- “返回模式的原始字符串。" 它不会返回文本边界(/)或选项(本例中为i)
Regexp
Regexp#source
/
i
missing_columns.map(&:source).join(', ') #=> "firstname, lastname"
1zmg4dgp2#
/\/|i/
让我们把它分解一下,外面的//是分隔符,有点像字符串的引号,所以实际的正则表达式在里面。
//
\/|i
\/表示匹配文字正斜杠。\防止它被解释为正则表达式的结尾。i表示匹配一个字面量i。到目前为止还没有什么特别的。但是|是一个 * 交替 *。它表示匹配 * 左边的东西或右边的东西。实际上,这将从字符串中删除所有斜线 * 和 * i。您希望删除所有/或/i,但不能单独使用i。您仍然可以使用交替来完成此操作,前提是您在两侧都包含斜线。
\/
\
|
/i
/\/|\/i/
您还可以使用?修饰符更简洁地执行此操作,这使得它之前的内容是可选的。
?
/\/i?/
最后,您可以通过使用%r{...}正则表达式形式而不是/来避免/\/栅栏恶作剧。
%r{...}
/\/
%r{/i?}
总而言之,这是
errors = msg.gsub(%r{/i?}, '')
2条答案
按热度按时间daupos2t1#
假定这些表达式看起来是不区分大小写的正则表达式
在这种情况下,您可以使用
Regexp
已经响应的方法,例如Regexp#source
,而不是将它们转换为字符串并尝试从那里操作它们Regexp#source
- “返回模式的原始字符串。" 它不会返回文本边界(/
)或选项(本例中为i
)1zmg4dgp2#
让我们把它分解一下,外面的
//
是分隔符,有点像字符串的引号,所以实际的正则表达式在里面。\/
表示匹配文字正斜杠。\
防止它被解释为正则表达式的结尾。i
表示匹配一个字面量i
。到目前为止还没有什么特别的。但是|
是一个 * 交替 *。它表示匹配 * 左边的东西或右边的东西。实际上,这将从字符串中删除所有斜线 * 和 *i
。您希望删除所有/
或/i
,但不能单独使用i
。您仍然可以使用交替来完成此操作,前提是您在两侧都包含斜线。您还可以使用
?
修饰符更简洁地执行此操作,这使得它之前的内容是可选的。最后,您可以通过使用
%r{...}
正则表达式形式而不是/
来避免/\/
栅栏恶作剧。总而言之,这是