Ruby regex - только захваченная группа gsub

Я не совсем уверен, что понимаю, как работают группы, не связанные с захватом. Я ищу регулярное выражение для получения этого результата: 5.214. Я думал, что приведенное ниже выражение будет работать, но оно заменяет все, включая группы без захвата. Как написать регулярное выражение только для замены групп захвата?

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

Мой желаемый результат:

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

Ответ 1

Вы не можете. gsub заменяет весь матч; он ничего не делает с захваченными группами. Не имеет значения, захвачены ли группы или нет.

Чтобы достичь результата, вам нужно использовать lookbehind и lookahead.

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

Ответ 2

gsub заменяет все совпадение, которое производит механизм регулярных выражений.

RTFM, обе группы захвата/несхватывания группы не сохраняются. Однако вы можете использовать lookaround утверждения, которые не "потребляют" любые символы в строке.

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

Объяснение: Эвакуационная последовательность \K сбрасывает начальную точку сообщенного соответствия, и все ранее использованные символы больше не включаются. При этом мы будем искать и сопоставлять запятую, а Positive Lookahead утверждает, что следующая цифра.

Ответ 3

не захватывающие группы по-прежнему потребляют матч
использовать
 "5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')
или
"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')

Ответ 4

Я ничего не знаю о рубине.

Но из того, что я вижу в учебнике

gsub означает замену, шаблон должен быть /(?<=\d+),(?=\d+)/ просто заменить запятую точкой или использовать захват /(\d+),(\d+)/ заменить строку на "\1.\2"?

Ответ 5

Вам не нужно regexp для достижения того, что вам нужно:

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

  • Периоды становятся ударами (1,200!00)
  • Запястья становятся периодами (1.200!00)
  • Банки становятся запятыми (1.200,00)