首页 > 解决方案 > 无法弄清楚为什么正则表达式组在 str_match 中不起作用

问题描述

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

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

我认为这应该与“WILL”的值匹配,但它返回空白。我用另一种语言尝试了 RegEx,在这种情况下,该组也返回空白。

我必须在这个正则表达式中添加什么才能只撤回值“WILL”?

标签: rregexregex-group

解决方案


您通过放置在组外形成了一个重复的捕获+组。放回去:

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

Will请注意,如果您在组之后使用惰性匹配,则可以修剪\s*

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

请参阅此正则表达式演示

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

或与基础 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)子字符串
    • $- 字符串结束。

推荐阅读