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
)