仅删除换行符之间的空格

Remove spaces between line breaks only

我有以下示例字符串,其中包含换行符“\n”和空格“”:

a <- "\n \n \n \nTEST TEST\n"

我想删除换行符 ("\n") 之后的空格 (" "),但不删除其他字符串(如我的玩具示例中的 "TEST")之后的空格。因此,我想要的输出是:

"\n\n\n\nTEST TEST\n"

我尝试了 stringr 的 str_remove_allstr_replace_all 但没有成功,因为它们似乎有问题在这种情况下,相邻出现的换行符。这是我得到的最接近的:

str_replace_all(a, "\n[ ]*\n", "\n\n")

我在这个(可能简单得可笑的)问题上花了几个小时,因此非常感谢任何帮助!

gsub("\n *", "\n", a)

str_replace_all(a, "\n *", "\n") # with stringr package

将为您提供所需的输出"\n\n\n\nTEST TEST\n"

编辑:对于 space(s) 仅在空行之间

请注意,上面的代码也会删除出现在非空行开头的 space——例如,如果字符串是 "\n TEST TEST \n"

@bobble bubble's suggestion of including (?=\n) into the search pattern (i.e., "\n *(?=\n)") works for between blank lines. (Thank you, bobble bubble)

gsub("\n *(?=\n)", "\n", a, perl=TRUE)

str_replace_all(a, "\n *(?=\n)", "\n") # with stringr package

(?=(regex)) 是一个 positive lookahead assertion。作为 "\n *(?=\n)",这意味着断言的正则表达式 \n 需要直接出现在 \n * 之后(带有空白的新行 space(s)),但它会 not 在字符串模式中被捕获。由于断言的正则表达式未在模式中捕获,因此在使用 gsubstringr::str_replace_all.

时不会被替换

为了更清楚地说明这一点,在以下示例中仅替换出现在“bu”之前的“b”:

str_replace_all("bobblebbubble", "b(?=bu)", "_")
#[1] "bobble_bubble"

我相信您可以删除任何由水平空格组成的行。使用 stringr,您可以使用

library(stringr)
a <- "\n \n   \n \nTEST TEST\n"
stringr::str_replace_all(a, "(?m)^\h+$", "")

R demo and the regex demo详情:

  • (?m) - 多行修饰符,使 ^ 匹配任何行的开头,$ 匹配任何行尾位置
  • ^ - 行首
  • \h+ - 一个或多个水平空白字符
  • $ - 行结束。