我有以下字符串
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;,这不是我想要的。
答案 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上的“替换”部分。