您可以使用 PCRE 正则表达式,例如
\G(?:(?! X ).)*?\K\b\d+A\b
请参阅regex demo。 详情:
-
\G - 字符串开始或上一个成功匹配的结束(仅确保连续匹配)
-
(?:(?! X ).)*? - 任何不以空格开头的字符,除了换行字符,尽可能少+X+空格字符序列
-
\K - 一个匹配重置操作符,丢弃目前匹配的所有文本
-
\b\d+A\b - 一个或多个数字和A 在字边界内。
在 R 中,你可以使用the following base R code:
x <- "50A ABC DE 51A FG 52A HI 53A"
rx <- "\\G(?:(?! X ).)*?\\K\\b\\d+A\\b"
regmatches(x, gregexpr(rx, x, perl=TRUE))
# => [[1]]
# [1] "50A" "51A" "52A" "53A"
x <- "50A ABC DE 51A FG X 52A HI 53A"
regmatches(x, gregexpr(rx, x, perl=TRUE))
# => [[1]]
# [1] "50A" "51A"
你可以把X之后的全部去掉,然后提取:
x <- "50A ABC DE 51A FG X 52A HI 53A"
library(stringr)
str_extract_all(sub("(\\s|^)X(\\s.*)?$", "", x), "\\b\\d+A\\b")
# => [[1]]
# [1] "50A" "51A"
x <- "50A ABC DE 51A FG 52A HI 53A"
str_extract_all(sub("(\\s|^)X(\\s.*)?$", "", x), "\\b\\d+A\\b")
# => [[1]]
# [1] "50A" "51A" "52A" "53A"
这里,
-
sub("(\\s|^)X(\\s.*)?$", "", x) 删除字符串开头或空格(带有此空格)之后的 X,并可选择在字符串末尾添加空格和任何文本
-
str_extract_all(..., "\\b\\d+A\\b") 提取一个或多个数字,后跟 A 作为剩余字符串部分中的整个单词。