我有一个像H B O & Co
这样的字符串,我希望删除H
,B
和O
HBO & Co
之间的空格。在我之前提出的问题(Remove spaces between words of a certain length)中,我得到了一个非常有用的答案,可以删除A & B Co
等字符串中的空格来制作A&B Co
。我想保留A&B Co
之类的字符串,但要避免使用HBO& Co
之类的字符串。要做到这一点,我将简单地在字符串上运行另一个正则表达式来修复这些情况:
gsub("(\\S\\S)\\&\\s", "$1 & ", "HBO& Co", perl=TRUE, ignore.case=TRUE)
然而,这似乎不是正确答案,因为它不使用$1
作为捕获组1.任何想法?
答案 0 :(得分:3)
您的反向引用不正确。有些引擎使用\1
语法,有些使用$1
,有些使用&
。要将捕获组插入R中的替换中,必须在组编号前加上反斜杠。此外ignore.case=TRUE
不是具有特殊含义的字符,因此您可以避免转义,我也认为您没有理由在通话中使用gsub('(\\S\\S)&\\s', '\\1 & ', 'HBO& Co', perl=TRUE)
# [1] "HBO & Co"
。
x <- c('A B C Company', 'XYZ Inc', 'S & K Co', 'H B O & Co', 'A & B Co')
gsub('(?<!\\S\\S)\\s+(?!(&\\s+)?\\S\\S)', '', x, perl=TRUE)
# [1] "ABC Company" "XYZ Inc" "S&K Co" "HBO & Co" "A&B Co"
但是,因为我answered你问的上一个问题;我说你可以避免运行另一个正则表达式来修复这些空格,并通过添加我提供的正则表达式在一次调用中执行此操作。
{{1}}
答案 1 :(得分:1)
gsub("(\\S\\S)\\&\\s", "\\1 & ", "HBO& Co", perl=TRUE, ignore.case=TRUE)