仅删除换行符之间的空格
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_all 和 str_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 在字符串模式中被捕获。由于断言的正则表达式未在模式中捕获,因此在使用 gsub
或 stringr::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+
- 一个或多个水平空白字符
$
- 行结束。
我有以下示例字符串,其中包含换行符“\n”和空格“”:
a <- "\n \n \n \nTEST TEST\n"
我想删除换行符 ("\n") 之后的空格 (" "),但不删除其他字符串(如我的玩具示例中的 "TEST")之后的空格。因此,我想要的输出是:
"\n\n\n\nTEST TEST\n"
我尝试了 stringr 的 str_remove_all 和 str_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 在字符串模式中被捕获。由于断言的正则表达式未在模式中捕获,因此在使用 gsub
或 stringr::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+
- 一个或多个水平空白字符$
- 行结束。