Регулярное выражение для добавления запятой между любым символом

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

x <- "ABCD"

я хочу получить

"A,B,C,D"

Было бы неплохо, если бы я мог сделать это, используя gsub, sub или связанный с вектором строк произвольного количества символов.

Я попытался

> sub("(\\w)", "\\1,", x)
[1] "A,BCD"
> gsub("(\\w)", "\\1,", x)
[1] "A,B,C,D,"
> gsub("(\\w)(\\w{1})$", "\\1,\\2", x)
[1] "ABC,D"
trimws(gsub("", ",", x),,",")
onyambu 31.10.2022 10:16

@Tom Я изменил «двоеточие» на «запятую» в своем редактировании.

bobble bubble 31.10.2022 11:04
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
105
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Вы можете использовать

> gsub("(.)(?=.)", "\\1,", x, perl=TRUE)
[1] "A,B,C,D"

Регулярное выражение (.)(?=.) соответствует любому символу, захватывающему его в группу 1 (с (.)), за которым должен следовать любой одиночный символ ((?=.)) — это положительный просмотр вперед, требующий символа непосредственно справа от текущего местоположения).

Варианты решения:

> gsub("(.)(?!$)", "\\1,", x, perl=TRUE)
## Or with stringr:
## stringr::str_replace_all(x, "(.)(?!$)", "\\1,")
[1] "A,B,C,D"

Здесь (?!$) терпит неудачу, если есть позиция конца строки.

Смотрите демо R онлайн:

x <- "ABCD"
gsub("(.)(?=.)", "\\1,", x, perl=TRUE)
# => [1] "A,B,C,D"
gsub("(.)(?!$)", "\\1,", x, perl=TRUE)
# => [1] "A,B,C,D"
stringr::str_replace_all(x, "(.)(?!$)", "\\1,")
# => [1] "A,B,C,D"

ах. Спасибо! Я думал, что это что-то о просмотре вперед, но мне не удалось заставить его работать. Спасибо также за объяснение, это действительно полезно.

Tom 31.10.2022 10:09

Дружественный ответ без регулярных выражений:

paste(strsplit(x, "")[[1]], collapse = ",")
#[1] "A,B,C,D"

Спасибо! Я тоже придумал это, но мне очень нужно наточить свой regex

Tom 31.10.2022 10:12

Пытаться:

x <- 'ABCD'
gsub('\\B', ',', x, perl = T)

Отпечатки:

[1] "A,B,C,D"

Возможно, неправильно прочитал запрос; OP хочет добавить запятую только между буквами. Поэтому попробуйте:

gsub('(\\p{L})(?=\\p{L})', '\\1,', x, perl = T)
  • (\p{L}) - Сопоставьте любую букву любого языка в 1-й группе;
  • (?=\p{L}) - Положительный прогноз для соответствия, как указано выше.

Мы можем использовать обратную ссылку на эту группу захвата в замене.

а, правильно: ‘⁠\B⁠’ соответствует пустой строке, если она не находится на краю слова; еще один полезный символ.

Tom 31.10.2022 10:15

@ Том, у меня есть дополнительный вопрос. Вы хотите добавить запятую между всеми символами? Включая саму запятую? Например, каков ваш желаемый результат, скажем, Hello,12&4. Хотя \B работает для текущих выборочных данных, это может привести к неожиданным результатам.

JvdV 31.10.2022 10:16

хехе, приятно. Но нет, не в этом случае

Tom 31.10.2022 10:17

@ Том, так что \B может быть не тем, что вы ищете, поскольку оно также будет соответствовать позициям, которые находятся не только между буквами. Сначала я неправильно истолковал ваш вопрос, но отредактировал свой ответ, включив в него способ сопоставления положения только между буквами.

JvdV 31.10.2022 10:22

ok ⁠\p{xx}⁠’ и ‘⁠\P{xx}⁠’, которые соответствуют символам со свойством ‘⁠xx⁠’ и без него соответственно, тогда как L означает «буква»?!

Tom 31.10.2022 10:25

@ Том, да. См. этот список для ссылок.

JvdV 31.10.2022 10:26

Хороший и имхо лучший ответ, особенно вторая часть.

bobble bubble 31.10.2022 11:24

Другой вариант — использовать положительный взгляд назад и взгляд вперед, чтобы утверждать, что есть предшествующий и последующий символы:

library(stringr)
str_replace_all(x, "(?<=.)(?=.)", ",")
[1] "A,B,C,D"

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