用否定替换(12345)

时间:2016-02-23 10:45:30

标签: ruby

我试图用括号替换一些字符串为负数:

e.g。 “(12345)”将成为“-12345” “(1,23)”将成为“-1,23” “(1.55)”将成为“-1.55”

这就是我的尝试:

amount = value[sum.to_sym].gsub /\((.+)\)/ , "-#$1"

但在某些情况下会返回“ - ”,例如“(59006)”

有更好的方法吗

2 个答案:

答案 0 :(得分:4)

问题是你的替代模式,而不是你的正则表达式。字符串插值Route::group(array('prefix' => 'admin'), function() { $router->bind('user', function ($value) { return app(UserInterface::class)->findOrFail($value); }); }); "-#$1"的缩写)在调用"-#{$1}"之前进行评估,因此您的替换模式是调用gsub时的$ 1。

您可以通过执行

来解决此问题
gsub

其中\ 1表示第一个捕获组或使用块形式

gsub /\((.+)\)/ , "-\\1"

如果性能至关重要,那么第二个可能会慢一点,因为gsub必须调用该块,但它不太可能有所作为

答案 1 :(得分:1)

你的正则表达式很好。使用括号或\1

"(59,006.23)".gsub(/\((.+)\)/){"-#$1"} #=> "-59,006.23"
"(59,006.23)".gsub(/\((.+)\)/,'-\1')   #=> "-59,006.23"

您当前代码的问题是它将"-#$1"作为gsub的参数。此时,$ 1尚未更新,因此保留了您上次匹配的值。 (尝试在gsub之前进行一些正则表达式匹配,然后你会看到我在说什么)

相关问题