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

时间:2017-03-06 14:49:15

标签: r regex

我有以下字符串

string <- c('a - b - c - d',
            'z - c - b',
            'y',
            'u - z')

我想将其分类,以便第二次出现之后的所有内容 - &#39;被扔掉了。

结果将是:

> string
[1]  "a - b" "z - c" "y"     "u - z"

我使用了substr(x = string, 1, regexpr(string, pattern = '[^ - ]*$') - 4),但它排除了最后一次出现的&#39}。 - &#39;,这不是我想要的。

2 个答案:

答案 0 :(得分:6)

请注意,您不能使用否定字符类来否定字符的序列[^ - ]*$匹配除空格之外的任何0+字符(是的,它匹配-,因为-创建了空格和空格之间的范围),后跟结尾字符串标记($)。

您可以使用以下正则表达式的sub函数:

^(.*? - .*?) - .*

替换为\1。请参阅regex demo

R代码:

> string <- c('a - b - c - d', 'z - c - b', 'y', 'u - z')
> sub("^(.*? - .*?) - .*", "\\1", string)
[1] "a - b" "z - c" "y"     "u - z"

<强>详情:

  • ^ - 字符串的开头
  • (.*? - .*?) - 第1组(在替换模式中引用\1反向引用)捕获任何0+字符 lazily 直到第一个空格,连字符,空格和然后再次任何0+字符到下一个最左边出现的空格,连字符,空格
  • - - 空格,连字符和空格
  • .* - 字符串末尾的任何零个或多个字符。

答案 1 :(得分:0)

试试这个(\w(?:\s+-\s+\w)?).*。有关正则表达式的解释,请查看此https://regex101.com/r/BbfsNQ/2

如果没有元组,那么正则表达式将检索第一个元组(如果存在)或仅仅是第一个元组。因此,数据进入“capturing group”。然后要显示捕获的组,它取决于使用的语言,但在纯正则表达式中\1将获得第一个组(\2获得第二个等...)。如果您不是一个图形示例,请查看regex101上的“替换”部分。