我想切断可变长度字符向量的末尾部分,这些字符都以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"
答案 0 :(得分:4)
尝试将 IJ
放在小组中:
^(.*?)(?:IJ|J|I)$
在尝试仅匹配IJ
或I
之前,它会与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"
$
将正则表达式锚定在字符串的末尾,然后匹配I
或J
或IJ
,并将其替换为空。