用正则表达式替换匹配中的子字符串

时间:2015-01-29 14:14:47

标签: regex r

我正在使用stringr,但解决方案不一定如此。在下面的字符串中,我想用下划线替换左边和右边(即前2)字母的所有空格。

str = 'ab cd ef 29 17 2 3'

stringr的replace_all似乎不支持子字符串匹配(如str_match_all封闭(...))。并且str_match_all不会取代。感谢建议。

3 个答案:

答案 0 :(得分:4)

gsub功能与基于环绕声的正则表达式一起使用。

> str = 'ab cd ef 29 17 2 3'
> gsub("(?<=[A-Za-z])\\s+(?=[A-Za-z])", "_",str, perl=T)
[1] "ab_cd_ef 29 17 2 3"

OR

> gsub("[A-Za-z]\\K\\s+(?=[A-Za-z])", "_",str, perl=T)
[1] "ab_cd_ef 29 17 2 3"

OR

> library(stringr)
> str_replace_all('ab cd ef 29 17 2 3', perl('(?<=[A-Za-z])\\s+(?=[A-Za-z])'), '_')
[1] "ab_cd_ef 29 17 2 3"

答案 1 :(得分:2)

(?<=[a-zA-Z])[ ](?=[a-zA-Z])

这应该为你做。看看后面会确保你有空格背后的信。

前瞻将确保你前面有一封信。参见演示。

https://regex101.com/r/zM7yV5/9

答案 2 :(得分:1)

这是另一种可能性:

gsub("([[:alpha:]])(\\s+)([[:alpha:]])", "\\1_\\3", x)

## "ab_cd_ef 29 17 2 3"