在 R 中使用反向引用的正则表达式

Regex using back references in R

我在 https://regex101.com/r/R8ObNk/1 (^[^\]*)\t([^\]*)\t([^\]*)\t([^\]*)\t([^\]*)(.*) 中编写了正则表达式,并向后引用捕获组 5 或“\5”。

出于某种原因,当我尝试使用上面使用 gsub 在 R 中编写的正则表达式时,我没有返回正确的数据。

这是我要返回参考的第一行数据的输入:

structure(list(value = "19-22\t\t4\tP,G\tDOB_TT\t\tTime of Birth\t\t126\t \t0000-2359 Time of Birth"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -1L))

这是上面一行的 gsub:gsub(pattern = "(^[^\]*)\t([^\]*)\t([^\]*)\t([^\]*)\t([^\]*)(.*)", replacement = "\5", x = a$value)。我知道你应该在 R 中使用正则表达式时添加另一个“\”,但仍然没有用。

gsub 的预期结果应该是“DOB_TT”或第 5 个捕获组

您需要小心使用转义字符。请注意,R 在网站无法理解的字符串中使用了额外的“”。当你看到像

这样的字符串时
x <- "a\tb"

在 R 中,字符串中没有斜杠。 \t 是制表符的转义符。所以 nchar(x) return 3,而不是 4,因为这两个值一起构成了一个制表符。所以根据你的数据,你真正想要的是

gsub(pattern = "(^[^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)(.*)",
  replacement = "\5", x = a$value)

制表符不需要额外的 \,因为制表符在正则表达式中并不特殊。它们只是普通字符。

在这种情况下您实际上不需要正则表达式,因为您的数据是结构化的:

parsed <- read.delim(text=a$value, header=FALSE)
parsed$V5
# [1] "DOB_TT"