r - 如何在 stringr 中使用常规表达式进行查找/替换
问题描述
给定一个像'running'这样的字符串,我想用'nn'替换'nn'以获得'running'。
使用 stringr 包我试过这个:
str_replace_all(s, "[:alpha:]\\-([ ])+[:alpha:]", "[:alpha:][:alpha:]")
但它似乎不是那样工作的。我想需要使用变量,但我可以弄清楚到底是如何使用的。
我试过这个:
str_replace_all(s, "[:alpha:]\\-([ ])+[:alpha:]", "\\0\\1")
但这也没有给出预期的结果。
有任何想法吗?
解决方案
您可以使用
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
示例中的替换模式是对相应捕获组值的反向引用。
推荐阅读
- scala - 使用 Futures 计算避免 Await 方法
- c# - Angular 8 post formData 到 ASP.NET Core API 无法绑定 IEnumerable/List
- javascript - 如何解决未捕获的类型错误:无法读取未定义的属性“0”?
- python-3.x - 在不使用全局的情况下从函数内部更改变量
- c# - 为什么我不能在一个表格中获得超过 30 个单元格?
- excel - Excel VBA宏循环“另存为”会增加文件大小?
- python - 如何在Python中程序启动时无边框显示图像(透明)
- jekyll - 为 Jekyll 设置 gemfile - 不清楚出了什么问题
- php - 使用 PHP 编辑 XML 文件
- django - Django:隐藏空单选按钮选项但仍然允许它不为空