在 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"
我在 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"