2014-10-20 7 views
10

캡쳐되지 않은 그룹의 작동 방식을 잘 모르겠습니다. 나는이 결과를 산출하기위한 정규식을 찾고있다 : 5.214. 나는 아래의 정규 표현식이 작동 할 것이라고 생각했지만 비 캡처 그룹을 포함한 모든 것을 대체하고있다. 캡처 그룹 만 바꾸려면 어떻게 정규식을 작성할 수 있습니까?Ruby 정규식 - gsub 만 캡쳐 된 그룹

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

내 원하는 결과 : 당신은 할 수 없습니다

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

만약 이것이 그는 단지 쉼표 만 바꾸는 것이 아닌가? – hwnd

+0

쉼표가 다른 컨텍스트에서 사용되는 긴 문자열이있을 수 있습니다. 예 : '나는 가게에 갔다. 그리고 나는 1,200 달러에 무언가를 샀다.'다음과 일치하는 쉼표 만 바꾸기를 원합니다. '\ d, \ d' – diasks2

+0

문자열에 소수점이있는 경우 그 문자가 혼합됩니다. 로케일을 수천명에'.'을 사용하는 언어로 변경하려면 XY 문제를 묻는 중입니다. 로케일 라이브러리를 사용하면 처음부터 다시 시도하는 것보다 훨씬 강력한 솔루션을 제공 할 수 있습니다. – sawa

답변

17

. gsub은 전체 일치를 대체합니다. 캡쳐 된 그룹과 아무런 관련이 없습니다. 그룹이 포획되었는지 여부에 상관없이 아무런 차이가 없습니다.

결과를 얻으려면 lookbehind와 lookahead를 사용해야합니다.

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

개인적으로 [alpha bravo의 답변] (https://stackoverflow.com/users/2716792/alpha-bravo)을 찾았습니다. IMO는 매우 쉬운 정규식을 구현하는 것이 훨씬 쉽습니다. (\ d +) (, \ d +) /, '\ 1. \ 3')'. 그것이하는 일은 세 가지 그룹을 정의하는 것입니다 : (이전) (교체해야 할 것) (이후) (교체) (교체) (교체) (교체) (교체) – nacho4d

7

gsub은 정규식 엔진이 생성하는 전체 일치를 대체합니다.

RTFM, 두 캡처/비 캡처 그룹 구성은 유지되지 않습니다. 그러나 lookaround 어설 션을 사용하여 문자열의 문자를 "소비"하지 않을 수 있습니다.

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

설명 :\K 이스케이프 시퀀스가보고 된 경기 및 이전에 소비되는 문자의 시작점이 더 이상을 포함 재설정하지 않습니다. 즉, 우리는 쉼표를 찾고 일치시킵니다. Positive Lookahead는 숫자가 뒤따라야한다고 주장합니다.

+2

귀하의 프로필에있는 [Explain Regular Expressions tool] (http://liveforfaith.com/re/explain.pl)이 매우 유용하고 시원합니다. 그것을 만들어 주셔서 감사합니다. – diasks2

5

비 캡처 그룹은 여전히 ​​경기
사용을
"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')
또는
"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')

0

내가 루비에 대해 아무것도 몰라를 소비한다.

그러나에서 내가 대체 의미 tutorial

GSUB에서 무엇을보고, 패턴이 /(?<=\d+),(?=\d+)/ 그냥 "\1.\2"와 문자열을 대체 할 점 또는 사용 캡처 /(\d+),(\d+)/와 쉼표를 교체해야

?

0

당신은 당신이 필요 달성하기 위해 정규 표현식 필요가 없습니다

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

  • 이 기간은 앞머리가 (1,200!00)
  • 쉼표가 될 기간 (1.200!00)
  • 앞머리는 1.200,00 (쉼표가 될)