【问题标题】:R regex match beginning and middle of a stringR 正则表达式匹配字符串的开头和中间
【发布时间】:2022-06-19 13:59:12
【问题描述】:

我有一个字符串向量:

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"

我可能希望这是一项简单的任务,但我无法与正则表达式相处。

谢谢!

【问题讨论】:

    标签: r regex string matching


    【解决方案1】:

    你快到了

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

    【讨论】:

      【解决方案2】:

      你可以使用

      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。请参阅regex demo online

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

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

      备注

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

      【讨论】:

        猜你喜欢
        • 2018-11-23
        • 1970-01-01
        • 2019-10-15
        • 2014-08-15
        • 1970-01-01
        • 2015-04-27
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        相关资源
        最近更新 更多