【问题标题】:Determine if string ends in whitespace and append a space if not确定字符串是否以空格结尾,如果不是则追加空格
【发布时间】:2015-05-06 14:24:40
【问题描述】:

我想检查一个字符串是否以空格结尾。如果不是,我想在字符串末尾添加一个尾随空格字符。

实际上,我检查字符串是否以grepl 的空格结尾,然后我在末尾paste 一个空格。

append_space <- function(x) {
  if(!grepl("(\\s)$", x))
    x <- paste0(x, " ")
  return(x)
}

但是,我认为我可以直接使用 sub 函数来执行此操作,使用 ! 进行负前瞻,但我不知道如何使用它。

有谁知道我可以用sub 做到这一点吗?

【问题讨论】:

  • 无论字符串的结尾如何,您的函数似乎都会附加一个空格。 &gt; sub("(.*[^\\s])", "\\1 ", "string") [1] "string " &gt; sub("(.*[^\\s])", "\\1 ", "string ") [1] "string " &gt; sub("(.*[^\\s])", "\\1 ", "string\n") [1] "string\n "
  • 那是因为我忘记了评论中的$,我发布了一个答案,在测试我的正则表达式之后我确实放了一个$......实际上,你是对的,那里即使使用 $ 也是一个错误 :-(

标签: regex r


【解决方案1】:

您可以将sub 与捕获组和替换部分中的反向引用一起使用:

sub("(\\S)$", "\\1 ", x)

\S 表示non-whitespace

demo

【讨论】:

  • 我认为这里不需要perl=TRUE (+1)
  • @BrodieG:没错,我只是觉得使用 Perl 风格更舒服。
  • 在我看来,perl = TRUE 确实应该是 R 正则表达式函数中的默认值。
  • @AlexA.,我同意,特别是因为 TRE 有一些错误。
【解决方案2】:

你也可以试试

 sub(' ?$', ' ', x)
 #[1] "blabla1 " "blabla2 "

在哪里

 x <- c("blabla1 ", "blabla2")

【讨论】:

  • 很好,我最喜欢这个。 +1
【解决方案3】:

我认为这种方法可行:

x <- c("blabla1 ","blabla2")

sub("(?<=([^ ])$)$", " ", x, perl=TRUE)
## [1] "blabla1 " "blabla2 "

【讨论】:

    【解决方案4】:

    就像我在评论中说的,你可以试试:

    sub("(.*[^ ])$","\\1 ", x)
    

    示例

    x <- c("blabla1 ","blabla2")
    sub("(.[^ ])$","\\1 ", x)
    #[1] "blabla1 " "blabla2 "
    

    【讨论】:

    • @AlexA。显然 [^\\s] 不能否定空格,所以必须用 \\S 代替
    • 如果你用括号替换括号,你的函数可以工作:sub("(.*(^\\s))$", "X", " string\n a a") 但我不知道有什么区别。
    • @JulienNavarre,只使用实际的空间(` `)实际上是有效的,有时根本不需要复杂化;-)
    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 2011-06-06
    • 1970-01-01
    • 2021-07-04
    • 2013-07-20
    相关资源
    最近更新 更多