如何查找以I,J或IJ结尾的变量名的基本部分

时间:2013-09-05 16:16:33

标签: regex r

我想切断可变长度字符向量的末尾部分,这些字符都以I,J或IJ结尾,但还没有完全正确:

目前的尝试,使用一个简单的案例。

vars <- c("VARI", "VARJ", "VARIJ")
sapply(vars, function(v) {
  m <- regexec("^(.*)(?:I|J|IJ)$", v)
  regmatches(v, m)[[1]][2]
})

但是,它不适用于IJ案例:

 VARI   VARJ  VARIJ 
"VAR"  "VAR" "VARI" 

2 个答案:

答案 0 :(得分:4)

尝试将IJ放在小组中:

^(.*?)(?:IJ|J|I)$

在尝试仅匹配IJI之前,它会与J匹配。

然后使.*懒惰(通过添加?)以防止.吃太多。

编辑:实际上,我搞砸了。这是交易:

^(.*)(?:J|I|IJ)$中,.*将尽可能匹配,即整个字符串。在VARIJ的情况下,它将回溯到VARI并看到`(?:J | I | IJ)$`部分匹配。

.*懒惰(通过添加?),点将首先与V中的VARIJ匹配,然后由于(?:J|I|IJ)$`` will continue with matching没有匹配一个. When it reaches R , it finds a match in(?:J | I | IJ)$``并停止吃更多的字符。

我最初搞砸了,因为这个问题有点像以前的问题,(1|5|10|50|100|500)之类的东西用于匹配500,但只有5匹配。这是不同的,因为行结束$。我很抱歉没有立即注意到变化。

结论,只要(?:J|I|IJ)$懒惰,您仍然可以使用.*

答案 1 :(得分:4)

好的旧简单gsub如何被矢量化,所以你只需要做...

gsub( "I$|J$|IJ$" , "" , vars )
#[1] "VAR" "VAR" "VAR"

$将正则表达式锚定在字符串的末尾,然后匹配IJIJ,并将其替换为空。