R,在第n次出现之前的所有内容的正则表达式

use*_*672 3 regex split r

s <- "1-343-43Hello_2_323.14_fdh-99H"
Run Code Online (Sandbox Code Playgroud)

在RI中想要使用正则表达式来获取子串,比如说第二个下划线.如何使用一个正则表达式完成这项工作?另一种方法是用'_'分割然后粘贴前两个 - 一些东西;

paste(sapply(strsplit(s, "_"),"[", 1:2), collapse = "_")
Run Code Online (Sandbox Code Playgroud)

得到:

[1] "1-343-43Hello_2"
Run Code Online (Sandbox Code Playgroud)

但是我如何制作正则表达式来做同样的事情呢?

hor*_*rux 7

一般来说,对于回答标题中的问题,是

sub("^(([^_]*_){n}[^_]*).*", "\\1", s)
Run Code Online (Sandbox Code Playgroud)

您允许n的数量在哪里_.


Wik*_*żew 6

您可以使用sub

sub("^([^_]*_[^_]*).*", "\\1", s)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

R代码演示

s <- "1-343-43Hello_2_323.14_fdh-99H"
sub("^([^_]*_[^_]*).*", "\\1", s)
## => [1] "1-343-43Hello_2"
Run Code Online (Sandbox Code Playgroud)

图案详情

  • ^- 字符串的开头
  • ([^_]*_[^_]*)- 第 1 组捕获除 之外的 0+ 个字符_,然后是 a _,再次捕获 0+ 个非_s
  • .*- 字符串的其余部分(请注意,TRE 正则表达式.也匹配换行符)。

替换\\1仅返回组 1 内的值。