如果下划线位于第3位之后,R Regex会在Underscore之后删除所有内容

时间:2017-09-26 17:24:16

标签: r regex

我一直在寻找解决方案两天。

以下是我的数据的样子和我想要实现的内容的示例:

dat <- c("f__dfty","fd_fgtekg","f_glgkt_s2","f_glgkt_s3","fthssfy_s2","fthssfy_s3","h__gkdnt_s2","sedfgrtsd")
dat <- c("f__dfty","fd_fgtekg","f_glgkt","f_glgkt","fthssfy","fthssfy","h__gkdnt","sedfgrtsd")

我需要在“_”之后删除所有内容,但如果下划线位于字符串的第2位和第3位,则不需要。并非每个字符串都有下划线。

谢谢!

1 个答案:

答案 0 :(得分:2)

不确定字符串的长度,因此我假设可以使用任何长度。

代码

See this code in use here

<强>正则表达式

^((?:.{3})?[^_\s]+).*$

注意:您实际上可以使用^((?:.{3})?[^_]+).*$,但由于我在regex101上的示例使用多行输入来简化操作,因此我发布了我在那里使用的代码。

<强>换人

$1

结果

输入

f__dfty
fd_fgtekg
f_glgkt_s2
f_glgkt_s3
fthssfy_s2
fthssfy_s3
h__gkdnt_s2
sedfgrtsd
aaaaaaa_aaaa

输出

f__dfty
fd_fgtekg
f_glgkt
f_glgkt
fthssfy
fthssfy
h__gkdnt
sedfgrtsd
aaaaaaa

说明

  • 在行^
  • 开头处断言位置
  • 捕获以下内容
    • 任意字符的可选匹配3次(?:.{3})?
    • 匹配_\s\s中不存在的任何字符的1和无限制,以防止在regex101上的示例中出现换行符;如果循环遍历数组/列表,可以从代码中删除/ etc。)[^_\s]+
  • 任意次数匹配任何字符.*
  • 在行$
  • 的末尾断言位置
  • 替换为第一个捕获组$1