无法弄清楚为什么正则表达式组在 str_match 中不起作用

Can't figure out why regex group is not working in str_match

我有以下带有正则表达式的代码

CHARACTER <- ^([A-Z0-9 .])+(?:\(V\.O\.\))?(?:\(O\.S\.\))?(?:\(CONT'D\))?$
str_match("WILL (V.O.)",CHARACTER)[1,2]

我认为这应该与 "WILL " 的值匹配,但它返回空白。 我用不同的语言尝试了 RegEx,并且在该实例中该组也返回空白。

我必须向此正则表达式添加什么才能仅返回值 "WILL"?

您通过将 + 放在组外形成了重复捕获组。放回去:

CHARACTER <- "^([A-Z0-9 .]+)(?:\(V\.O\.\))?(?:\(O\.S\.\))?(?:\(CONT'D\))?$"
                          ^

请注意,如果您在组后使用 \s* 的惰性匹配,您可能 trim Will

CHARACTER <- "^([A-Z0-9\s.]+?)\s*(?:\(V\.O\.\))?(?:\(O\.S\.\))?(?:\(CONT'D\))?$"

参见 this regex demo

> library(stringr)
> CHARACTER <- "^([A-Z0-9\s.]+?)\s*(?:\(V\.O\.\))?(?:\(O\.S\.\))?(?:\(CONT'D\))?$"
> str_match("WILL (V.O.)",CHARACTER)[1,2]
[1] "WILL"

或者,您可以 提取 Will

> str_extract("WILL (V.O.)", "^.*?(?=\s*(?:\(V\.O\.\))?(?:\(O\.S\.\))?(?:\(CONT'D\))?$)")
[1] "WILL"

或与base R相同:

> regmatches(x, regexpr("^.*?(?=\s*(?:\(V\.O\.\))?(?:\(O\.S\.\))?(?:\(CONT'D\))?$)", x, perl=TRUE))
[1] "WILL"

这里,

  • ^ - 匹配字符串的开头
  • .*? - 除换行字符外的任何 0+ 个字符尽可能少
  • (?=\s*(?:\(V\.O\.\))?(?:\(O\.S\.\))?(?:\(CONT'D\))?$) - 确保在当前位置的右侧,有
    • \s* - 0+ 个空格
    • (?:\(V\.O\.\))? - 一个可选的 (V.O.) 子串
    • (?:\(O\.S\.\))? - 一个可选的 (O.S.) 子串
    • (?:\(CONT'D\))? - 一个可选的 (CONT'D) 子串
    • $ - 字符串结尾。