R正则表达式匹配字符串的开头和中间

R regex match beginning and middle of a string

我有一个字符串向量:

A <- c("Hello world", "Green 44", "Hot Beer", "Bip 6t")

我想在每个第一个单词的开头和结尾添加一个星号 (*),如下所示:

"*Hello* world", "*Green* 44", "*Hot* Beer", "*Bip* 6t"

使用 stringr 中的 str_replace() 是有意义的。 但是,我正在努力使用正则表达式来匹配每个字符串的第一个单词。

最好的成绩是:

str_replace(A, "^([A-Z])", "*\1*"))
"*H*ello world", "*G*reen 44", "*H*ot Beer", "*B*ip 6t"

我可能希望这是一个简单的任务,但我不喜欢正则表达式。

谢谢!

你快到了

str_replace(A, "(^.*) ", "*\1* ")
#> [1] "*Hello* world" "*Green* 44"    "*Hot* Beer"    "*Bip* 6t" 

你可以使用

sub("([[:alpha:]]+)", "*\1*", A)
## => [1] "*Hello* world" "*Green* 44"    "*Hot* Beer"    "*Bip* 6t"     

stringr等价于

library(stringr)
stringr::str_replace(A, "([[:alpha:]]+)", "*\1*")
stringr::str_replace(A, "(\p{L}+)", "*\1*")

参见R demo online. See the regex demo online

([[:alpha:]]+) 正则表达式匹配并将一个或多个字母捕获到第 1 组中,** 替换将匹配替换为 * + 第 1 组值 + *

请注意,sub 仅查找并替换第一个匹配项,因此每个字符向量中只有第一个单词受到影响。

备注

  • 如果您打算将单词 恰好 放在字符串的开头(而不仅仅是“第一个单词”),请在字符串的开头添加 ^模式(例如 sub("^([[:alpha:]]+)", "*\1*", A)
  • 如果单词是 non-whitespace 个字符的块,请使用 \S+ 而不是 [[:alpha:]]+\p{L}+(例如 sub("^(\S+)", "*\1*", A)
  • 如果单词是字母或数字或下划线的任何块,您可以使用 \w+,即 sub("^(\w+)", "*\1*", A)
  • 如果单词是任何字母或数字块但不是下划线,则可以使用[[:alnum:]]+,即sub("^([[:alnum:]]+)", "*\1*", A)