在R中,有沒有比找到字符串中最後一個點的位置更好/更簡單的方法?R:查找字符串中的最後一個點
x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)] # returns 16
這找到字符串中的所有點,然後返回最後一個,但它似乎相當笨拙。我嘗試使用正則表達式,但沒有太多。
在R中,有沒有比找到字符串中最後一個點的位置更好/更簡單的方法?R:查找字符串中的最後一個點
x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)] # returns 16
這找到字符串中的所有點,然後返回最後一個,但它似乎相當笨拙。我嘗試使用正則表達式,但沒有太多。
這是否適合您?
x <- "hello.world.123.456"
g <- regexpr("\\.[^\\.]*$", x)
g
\.
點[^\.]
匹配的一切,但點*
匹配指定前面的表達式(一切,但點)可以在0和之間發生無限次$
標誌着字符串的結尾。把所有東西放在一起:找到一個點,除了一個點之外的任何東西,直到字符串結束。 R要求\
被轉義,因此\\
在上面的表達式中。請參閱regex101.com以嘗試使用正則表達式。
小的語法改進如何?
這將適用於輸入矢量長度爲1的字面示例。使用escapes來獲取文字「。」。搜索和反向結果得到最後的索引「第一」:
rev(gregexpr("\\.", x)[[1]])[1]
更合適的矢量版本(如果x
比1以上):
sapply(gregexpr("\\.", x), function(x) rev(x)[1])
和另一個整潔的選項使用尾部代替:
sapply(gregexpr("\\.", x), tail, 1)
有人發表了以下的答案,我真的很喜歡,但我注意到,他們已經刪除了:
regexpr("\\.[^\\.]*$", x)
我喜歡它,因爲它直接產生所需的位置,而不必通過的結果進行搜索。正則表達式也相當乾淨,這是有關正則表達式的一個例外:)
是的,那就是我。我以爲以前的解決方案工作,所以我刪除它。也許我不應該有:) – Vincent 2011-03-07 02:11:12
+1神祕但短而直接! – 2011-03-07 03:34:16
a'。'匹配每個可能的字符,以匹配文字'。'。你需要用'\'來逃避它,不幸的是,你需要用另一個'\'來逃避這個'\'。所以最後你的表情看起來像'\\'。 – CousinCocaine 2014-04-16 09:28:19