2014-10-20 62 views
10

我不太確定我瞭解非捕獲組是如何工作的。我正在尋找一個正則表達式來產生這個結果:5.214。我認爲下面的正則表達式可以工作,但它正在取代包括非捕獲組在內的所有東西。我如何編寫正則表達式來替換捕獲組?Ruby正則表達式 - gsub只捕獲組

"5,214".gsub(/(?:\d)(,)(?:\d)/, '.') 
# => ".14" 

我想要的結果:

"5,214".gsub(some_regex) 
#=> "5.214 
+1

如果這是t他的情況,爲什麼不只是替換逗號? – hwnd 2014-10-20 01:28:37

+0

我可能有一個更長的字符串,其中逗號用於不同的上下文中。例如:「我去了商店,然後我以1200美元的價格買了東西。'我只想替換符合以下內容的逗號:'\ d,\ d' – diasks2 2014-10-20 01:33:51

+0

如果在字符串中也有小數點,則會混淆。如果您想要將語言環境更改爲使用'。。'的語言來處理數千個語言,那麼您就需要一個XY問題。使用語言環境庫可能會比從頭開始嘗試它提供更強大的解決方案。 – sawa 2014-10-20 01:37:55

回答

17

你不能。 gsub取代整個比賽;它不會對被捕獲的組織做任何事情。這些團體是否被抓獲並沒有什麼區別。

爲了達到這個效果,你需要使用lookbehead和lookahead。

"5,214".gsub(/(?<=\d),(?=\d)/, '.') 
+0

我個人發現[阿爾法布拉沃的回答](https://stackoverflow.com/users/2716792/alpha-bravo)。海事組織是非常容易實施的非平凡的正則表達式。 '「5,214」.gsub(/(\ d +)(,)(\ d +)/,'\ 1. \ 3')'。它的作用是:定義三組:(之前)(你需要替換)(之後),現在替換(之前)(替換)(之後)。 – nacho4d 2017-11-17 05:00:42

7

gsub替換正則表達式引擎產生的整個匹配。

RTFM,捕獲/非捕獲組構造不被保留。但是,您可以使用lookaround斷言,它不會「消耗」字符串上的任何字符。

"5,214".gsub(/\d\K,(?=\d)/, '.') 

說明:\K轉義序列重置報道比賽任何先前消耗的字符的出發點不再包括。話雖如此,我們然後查找並匹配逗號,並且積極Lookahead聲稱隨後有一個數字。

+2

你的[解釋正則表達式工具](http://liveforfaith.com/re/explain.pl)列在你的個人資料中是非常有用和酷。感謝您的創造。 – diasks2 2014-10-20 01:47:12

5

非捕獲組仍然消耗了比賽
使用
"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')

"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')

0

我一無所知紅寶石。

但是從我在tutorial

GSUB看的意思更換, 模式應該是/(?<=\d+),(?=\d+)/剛剛更換點 或使用捕捉/(\d+),(\d+)/逗號替換"\1.\2"字符串?

0

你不需要正則表達式來實現你需要的東西:

'1,200.00'.tr('.','!').tr(',','.').tr('!', ',')

  • 月經變得劉海(1,200!00
  • 逗號成爲週期(1.200!00
  • 劉海變成逗號(1.200,00