2011-03-07 64 views
31

在R中,有沒有比找到字符串中最後一個點的位置更好/更簡單的方法?R:查找字符串中的最後一個點

x <- "hello.world.123.456" 
g <- gregexpr(".", x, fixed=TRUE) 
loc <- g[[1]] 
loc[length(loc)] # returns 16 

這找到字符串中的所有點,然後返回最後一個,但它似乎相當笨拙。我嘗試使用正則表達式,但沒有太多。

回答

47

這是否適合您?

x <- "hello.world.123.456" 
g <- regexpr("\\.[^\\.]*$", x) 
g 
  • \.
  • [^\.]匹配的一切,但點
  • *匹配指定前面的表達式(一切,但點)可以在0和之間發生無限次
  • $標誌着字符串的結尾。

把所有東西放在一起:找到一個點,除了一個點之外的任何東西,直到字符串結束。 R要求\被轉義,因此\\在上面的表達式中。請參閱regex101.com以嘗試使用正則表達式。

+0

+1神祕但短而直接! – 2011-03-07 03:34:16

+1

a'。'匹配每個可能的字符,以匹配文字'。'。你需要用'\'來逃避它,不幸的是,你需要用另一個'\'來逃避這個'\'。所以最後你的表情看起來像'\\'。 – CousinCocaine 2014-04-16 09:28:19

27

小的語法改進如何?

這將適用於輸入矢量長度爲1的字面示例。使用escapes來獲取文字「。」。搜索和反向結果得到最後的索引「第一」:

rev(gregexpr("\\.", x)[[1]])[1] 

更合適的矢量版本(如果x比1以上):

sapply(gregexpr("\\.", x), function(x) rev(x)[1]) 

和另一個整潔的選項使用尾部代替:

sapply(gregexpr("\\.", x), tail, 1) 
+0

+1不錯,你擊敗了我。 – 2011-03-07 01:13:51

+0

是的,打我也是:) – Vincent 2011-03-07 01:20:26

+0

現在這是整潔的... – aL3xa 2011-03-07 01:26:14

4

有人發表了以下的答案,我真的很喜歡,但我注意到,他們已經刪除了:

regexpr("\\.[^\\.]*$", x) 

我喜歡它,因爲它直接產生所需的位置,而不必通過的結果進行搜索。正則表達式也相當乾淨,這是有關正則表達式的一個例外:)

+1

是的,那就是我。我以爲以前的解決方案工作,所以我刪除它。也許我不應該有:) – Vincent 2011-03-07 02:11:12

相關問題