替换具有新行的字符串中最后一次出现的正则表达式(Emacs 中的 replace-regexp-in-string)

Replace last occurence of regexp in a string which has new lines (replace-regexp-in-string in Emacs)

我在 Emacs 中解析了这个表达式:

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

我想用 afternothing 可能有的任意数量的空格替换最后一个 %>%。所以这有效:

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

和returnsmtcars %>% head() %>% select(mpg, cyl)

但我实际拥有的是:

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

其中 returns 替换所有 %>% 而不是最后一个:

mtcars
head()
select(mpg, cyl)

有谁知道如何使用带有新行的字符串而不是单个字符串来实现这一点?

. 不匹配换行符。告诉正则表达式换行符也可以在 %>% 之前,因此 \1 将匹配所有前面的行:

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