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

时间:2018-08-20 10:50:00

标签: r regex regex-group

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

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

我认为这应该与“ WILL”的值匹配,但它返回空白。 我用另一种语言尝试过RegEx,在该实例中,该组也恢复为空白。

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

1 个答案:

答案 0 :(得分:1)

您通过将+放在一个小组之外来组成一个重复的捕获小组。放回去:

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

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

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"

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