无法弄清楚为什么正则表达式组在 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)
子串
$
- 字符串结尾。
我有以下带有正则表达式的代码
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)
子串$
- 字符串结尾。