你的模式包含.+
部分匹配尽可能多的一个或多个字符,最好你的模式可以从传入的字符串中抓取最后4个数字块。
您可以使用
^.*?\((\d{4})(?:/[^)]*)?\).*
与\1
更换,只保留4位数字。见the regex demo。
详细
^
- 串 开始
.*?
- 任何0+字符尽可能少
\(
- 一个(
(\d{4})
- 第1组:四位数字
(?:
- 可选非c的开始apturing组
)?
其他任何0+字符 - 一个)
(OPTIONAL,可被省略) - 组
\)
的端
.*
- 字符串的其余部分。
见R demo:
a <- c('"You Are There" (1953) {The Death of Socrates (399 B.C.) (#1.14)}', 'Þegar það gerist (1998/I) (TV)', 'Johannes Passion, BWV. 245 (1725 Version) (1996) (V)')
sub("^.*?\\((\\d{4})(?:/[^)]*)?\\).*", "\\1", a)
# => [1] "1953" "1998" "1996"
另一个基础R溶液是(
后4个位数匹配:
regmatches(a, regexpr("\\(\\K\\d{4}(?=(?:/[^)]*)?\\))", a, perl=TRUE))
# => [1] "1953" "1998" "1996"
的\(\K\d{4}
模式匹配(
,然后将其滴由于\K
匹配重置操作员,然后看到一个(?=(?:/[^)]*)?\\))
确保有一个可选/
+ 0 + ch除)
之外,然后是)
。请注意,regexpr
仅提取第一个匹配项。
那么,预期的匹配是“1953”还是“1998”?尝试'sub(“^。*?\\((\\ d {4})[^)] * \\)。*”,“\\ 1”,a)' –
是的,抱歉没有指出。 –