String#gsub, как использовать совпадение в атрибуте replace, а также вставлять линию разрыва

С помощью String#gsub я могу вставить строки разрыва в атрибут replace:

"my string".gsub(/\s/, "\n") #=> "my\nstring"

Но если я также хочу использовать часть совпадения регулярного выражения в атрибуте replace, я буду вынужден использовать одинарные квоты ('). И тогда я не знаю, как вставить разрывную линию.

Я пробовал:

> "my string".gsub!(/(my )/, '\1\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\\\n')
=> "my \\\\nstring"
> "my string".gsub!(/(my )/, '\1\\\\\n')
=> "my \\\\nstring"

Ничего не работает.

Самый простой вариант — использовать две обратные косые черты для обратной ссылки "my string".gsub!(/(my )/, "\\1\n"). В вашем простом примере вы можете использовать взгляд назад. "my string".gsub!(/(?<=my )/, "\n"). Вы также можете смешивать одинарные и двойные кавычки, используя обратную ссылку "my string".gsub!(/(my )/, '\1'.concat("\n"))

engineersmnky 26.08.2024 15:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам не нужно использовать одинарные кавычки. Просто используйте двойные кавычки и замените \1 на \\1:

irb> "my string".gsub(/(my )/, "\\1\n")
=> "my \nstring"

Разница между одинарными и двойными кавычками заключается в том, что в строках с одинарными кавычками нельзя использовать escape-последовательности (кроме одинарных кавычек). Эти строки эквивалентны:

irb> '\1' == "\\1"
=> true
irb> '\n' == "\\n"
=> true

Это упоминается в документации: «Обратной ссылке обычно предшествует дополнительная обратная косая черта. Например, если вы хотите записать обратную ссылку \& в replacement со строковым литералом в двойных кавычках, вам нужно написать "..\\&.."». . Раньше он был прямо в документации для String#gsub , но с тех пор был перенесен в общую документацию для Методы замены

engineersmnky 26.08.2024 15:34

@engineersmnky, но это не сработало "my string".gsub!(/(my )/, '\1\\n') #=> "my \\nstring"

fguillen 26.08.2024 15:48

@fguillen в документации указано, хотите ли вы написать обратную ссылку... со строковым литералом в двойных кавычках. Вы сравниваете это утверждение с разрывом строки в литерале, заключенном в одинарные кавычки.

engineersmnky 26.08.2024 15:53

Вы можете использовать несколько стилей кавычек одновременно. Хотя это используется редко, в Ruby вы можете смешивать и сопоставлять строковые литералы с разными стилями кавычек.

Из документации:

Любая комбинация соседних строк с одинарными, двойными кавычками и процентами будет объединяться, если строка с процентами не является последней.

Применительно к вашей проблеме:

"my string".gsub(/(my )/, '\1' "\n")
#=> "my \nstring"

В приведенном выше коде '\1' "\n" представляет один экземпляр строки. Вы также можете вставить эти объединенные литералы в IRB, и он вернет эквивалент строкового литерала в двойных кавычках:

'\1' "\n"
#=> "\\1\n"

Что, в свою очередь, вы можете использовать в своем коде:

"my string".gsub(/(my )/, "\\1\n")
#=> "my \nstring"

Это не мой минус, поскольку мне нравится более эзотерическая сторона рубина. В этом смысле пространство между ними технически ненужно, например. '\1'"\n" и если вы действительно хотите расстроить некоторых людей ?\\+?1+?\n или ?\\<<?1<<?\n (что почти похоже на последовательность инструкций)

engineersmnky 26.08.2024 16:05

Это может быть полезно для обфускации :) << однако это вызовы методов, тогда как соседние литералы обрабатываются на этапе парсера.

Stefan 26.08.2024 16:08

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

engineersmnky 26.08.2024 16:13

Другие вопросы по теме

Похожие вопросы

Bash-скрипт для сокращения имени файла до длины не более n, но без обрезки целых слов
Как извлечь часть строки с помощью sed?
Как использовать регулярное выражение для извлечения набора определенных подстрок?
Негативный просмотр, похоже, не работает должным образом
Объединить многострочные строки в фрейме данных pandas на основе шаблона регулярного выражения
Регулярное выражение для текста, разделенного запятыми, с необязательными двойными кавычками, которые могут содержать кавычки, экранированные обратной косой чертой
Почему эта замена регулярного выражения с использованием захвата зависает в этом быстром коде?
Токенизация XSLT с помощью регулярного выражения для токенизации только в том случае, если за точкой с запятой не следует пробел и число
Regex соответствует определенным шаблонам URL-адресов
Используйте одно регулярное выражение для извлечения информации из двух шаблонов