我有以下带有正则表达式的代码
CHARACTER <- ^([A-Z0-9 .])+(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$
str_match("WILL (V.O.)",CHARACTER)[1,2]
我认为这应该与“ WILL”的值匹配,但它返回空白。 我用另一种语言尝试过RegEx,在该实例中,该组也恢复为空白。
我必须在此正则表达式中添加什么才能只拉回“ WILL”值?
答案 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)
子字符串$
-字符串的结尾。