Заменить последнее вхождение регулярного выражения в строку, содержащую новые строки (replace-regexp-in-string в Emacs)

#regex #replace #emacs

#регулярное выражение #заменить #emacs

Вопрос:

У меня есть это выражение, которое я разобрал в Emacs:

 mtcars %>%
head() %>%
select(mpg, cyl) %>%"
 

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

 (replace-regexp-in-string "%>% *$" "" "mtcars %>% head() %>% select(mpg, cyl) %>%")
 

и возвращает mtcars %>% head() %>% select(mpg, cyl)

Но то, что у меня на самом деле есть, это:

 (replace-regexp-in-string "%>% *$" "" "mtcars %>%
head() %>%
select(mpg, cyl) %>%")

 

который возвращает замену всех %>% вместо последнего:

 mtcars
head()
select(mpg, cyl)
 

Кто-нибудь знает, как добиться этого с помощью строки с новыми строками, а не в одной?

Ответ №1:

. не соответствует новой строке. Сообщите регулярному выражению, что новые строки также могут предшествовать the %>% , поэтому \1 они будут соответствовать всем предыдущим строкам:

 (replace-regexp-in-string "\(\(.\|n\)*\)%>% *$" "\1" "mtcars %>%
head() %>%
select(mpg, cyl) %>%")
 

Комментарии:

1. Я должен задать это в отдельном вопросе, но на случай, если для вас это простая однострочная строка. Я хочу, чтобы вышеприведенное работало (что оно и делает), но всякий раз, когда в последней строке нет %>%, ее следует оставить как есть. Итак, это: (replace-regexp-in-string "\(\(.\|n\)*\)%>% *$" "\1" "mtcars %>% head() %>% select(mpg, cyl) %>% arrange(cyl)") не должно удалять %>%. Я попытался принудительно выполнить это, настроив регулярное выражение так, чтобы оно заменяло только %>% *$ до конца строки, но оно продолжает удалять последнее %>% . Любая подсказка была бы отличной!

2. @cimentadaj: заменить $ (конец строки) на \' (конец строки).