这个红宝石正则表达式有什么不同?

时间:2015-09-18 02:38:56

标签: ruby regex

我试图用逗号或百分号替换,但它一直失败,所以我打开了IRB并试了一些东西。任何人都可以向我解释为什么第一个正则表达式(IRB第13行)不起作用但翻转版本(IRB第15行)?我上下打量了,我没有看到任何拼写错误,所以它必须与规则有关但我无法看清楚。

b.gsub(/[%]*|[,]*/,"")
# => "245,324" 
b.gsub(/[,]*/,"")
# => "245324" 
b.gsub(/[,]*|[%]*/,"")
# => "245324" 
b
# => "245,324"

1 个答案:

答案 0 :(得分:1)

因为ruby在整个字符串中愉快地找到[%]*零次并进行替换。看看这个结果:

b = '232,000'
puts b.gsub(/[%]*/,"-")

--output:--
-2-3-2-,-0-0-0-

如果您将要删除的所有字符放入同一个字符类中,那么您将获得所需的结果:

b = "%245,324,000%"
puts b.gsub(/[%,]*/, '')
--output:--

245324000

即便如此,仍有许多不必要的替代品继续进行:

b = "%245,324,000%"
puts b.gsub(/[%,]*/, '-')

--output:--
--2-4-5--3-2-4--0-0-0--

zero or more让你陷入困境,因为红宝石可以找到许多有0%符号或0逗号的地方。实际上你不想做ruby找到你的字符零的替换,而是你想做至少出现一个字符的替换:

b = '%232,000,000%'
puts b.gsub(/%+|,+/,"")

--output:--
232000000

或等同地:

puts b.gsub(/[%,]+/, '')

另外,请注意,正则表达式就像双引号字符串,因此您可以插入它们 - 就好像分隔符//是双引号:

one_or_more_percents = '%+'
one_or_more_commas = ',+'
b = '%232,000,000%'

puts b.gsub(/#{one_or_more_percents}|#{one_or_more_commas}/,"")

--output:--
232000000

但是当你的正则表达式由单个字符组成时,只需使用一个字符类:[%,]+