2

我想截断可变长度字符向量的结尾部分,这些字符都以 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" 
4

2 回答 2

4

尝试将第IJ一个放入组中:

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

它会IJ在尝试匹配IJ单独匹配之前匹配。

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

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

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

使.*懒惰(通过添加 a ?),点将首先匹配Vin VARIJ,然后因为没有匹配(?:J|I|IJ)$`` will continue with matchingA . When it reachesR , it finds a match in(?:J|I|IJ)$`` 并停止吃更多字符。

我最初搞砸了,因为这个问题有点像以前的问题,其中类似的东西(1|5|10|50|100|500)被用来匹配500但只5被匹配。这在这里有所不同,因为 end of line anchor $。我很抱歉没有立即注意到变化。

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

于 2013-09-05T16:18:23.323 回答
4

好的旧的简单gsub矢量化怎么样,所以你只需要做......

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

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

于 2013-09-05T16:24:43.577 回答