首页 > 解决方案 > 如何在 stringr 中使用常规表达式进行查找/替换

问题描述

给定一个像'running'这样的字符串,我想用'nn'替换'nn'以获得'running'。

使用 stringr 包我试过这个:

str_replace_all(s, "[:alpha:]\\-([ ])+[:alpha:]", "[:alpha:][:alpha:]")

但它似乎不是那样工作的。我想需要使用变量,但我可以弄清楚到底是如何使用的。

我试过这个:

str_replace_all(s, "[:alpha:]\\-([ ])+[:alpha:]", "\\0\\1")

但这也没有给出预期的结果。

有任何想法吗?

标签: rregexstringrstringi

解决方案


您可以使用

stringr::str_replace_all(s, "(?<=\\p{L})- +(?=\\p{L})", "")
stringr::str_replace_all(s, "(\\p{L})- +(\\p{L})", "\\1\\2")

或者,匹配任何水平空白字符

stringr::str_replace_all(s, "(?<=\\p{L})-\\h+(?=\\p{L})", "")
stringr::str_replace_all(s, "(\\p{L})-\\h+(\\p{L})", "\\1\\2")

基本 R 等效项:

gsub("(?<=\\p{L})-\\h+(?=\\p{L})", "", s, perl=TRUE)
gsub("(\\p{L})-\\h+(\\p{L})", "\\1\\2", s, perl=TRUE)
gsub("([[:alpha:]])-\\s+([[:alpha:]])", "\\1\\2", s)

查看正则表达式演示

细节

  • (?<=\p{L})- 与紧接在任何 Unicode 字母之前的位置相匹配的正向后视
  • - +- 连字符后跟 1 个或多个空格(\h匹配任何水平空格)
  • (?=\p{L})- 与紧随其后的任何 Unicode 字母的位置匹配的正向前瞻。
  • (\p{L})- 匹配任何字母的捕获组。

使用捕获组的\1\2示例中的替换模式是对相应捕获组值的反向引用。


推荐阅读