在第二次出现某个字符串后排除所有内容

D P*_*nto 6 regex r

我有以下字符串

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),但它排除了最后一次' - ',这不是我想要的.

Wik*_*żew 6

请注意,您不能使用否定字符类来否定字符序列.[^ - ]*$匹配除空格之外的任何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+字符,直到下一个最左边出现的空格,连字符,空格
  • - - 空间,连字符和空格
  • .* - 字符串末尾的任何零个或多个字符.