我有以下字符串
string <- c('a - b - c - d',
'z - c - b',
'y',
'u - z')
Run Code Online (Sandbox Code Playgroud)
我想将它分配,以便第二次出现' - '后的所有内容都被丢弃.
结果是这样的:
> string
[1] "a - b" "z - c" "y" "u - z"
Run Code Online (Sandbox Code Playgroud)
我用过substr(x = string, 1, regexpr(string, pattern = '[^ - ]*$') - 4)
,但它排除了最后一次' - ',这不是我想要的.
请注意,您不能使用否定字符类来否定字符序列.[^ - ]*$
匹配除空格之外的任何0+字符(是的,它也匹配-
,因为-
创建了空格和空格之间的范围),后跟字符串标记($
)的结尾.
您可以使用sub
具有以下正则表达式的函数:
^(.*? - .*?) - .*
Run Code Online (Sandbox Code Playgroud)
替换为\1
.请参阅正则表达式演示.
R代码:
> string <- c('a - b - c - d', 'z - c - b', 'y', 'u - z')
> sub("^(.*? - .*?) - .*", "\\1", string)
[1] "a - b" "z - c" "y" "u - z"
Run Code Online (Sandbox Code Playgroud)
细节:
^
- 开始一个字符串(.*? - .*?)
- 第1组(\1
在替换模式中引用反向引用)懒惰地捕获任何0+字符到第一个空格,连字符,空格,然后再到任何0+字符,直到下一个最左边出现的空格,连字符,空格 -
- 空间,连字符和空格.*
- 字符串末尾的任何零个或多个字符.