避免"&"在正则表达式

时间:2014-11-16 00:32:08

标签: regex r

我有一个像H B O & Co这样的字符串,我希望删除HBO 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.任何想法?

2 个答案:

答案 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)