所以假設我有一個字串
"Happy 2022 New 01 years!"
我正在尋找回傳“01”。更具體地說,我需要字串中的最后一組數字。這個數字可能只是“1”、“10”或“999”……否則字串幾乎可以是任何東西。我用 gsub 嘗試了各種正則運算式,但似乎無法正確使用。我有什么誤解。
例如,如果我這樣做:
gsub('.*(\\d ).*$', '\\1', x)
那為什么我會回傳“1”?正則運算式中的“ ”是否沒有指定一位或多位數字?
我的解釋怎么錯了?:'。' 代表任何字符,'(\\d )' 代表一位或多位數字,'。'對于更多字符,'$' 在字串的末尾。gsub 是貪婪的,因此它將回傳最后一組數字(因此是“01”,而不是“2022”)。'\\1' 將用第一個也是唯一的匹配替換整個字串。x 是字串。
uj5u.com熱心網友回復:
在您的正則運算式中, a.*將匹配所有字符(換行符除外),因此匹配整個字串。然后,引擎嘗試匹配,\d 但字串中已沒有更多字符可供匹配。因此,進行回溯.*直到找到一個數字。一旦找到一個數字(即,1在您的情況下),\d 匹配該數字,并且字串的其余部分再次與.*.
你可以試試這個正則運算式:
\d (?![^\r\n\d]*\d)
點擊演示
解釋:
\d- 匹配 1 個或多個數字,盡可能多(?![^\r\n\d]*\d)- 負前瞻以確保字串后面沒有更多數字
uj5u.com熱心網友回復:
在目標最終數字周圍放置單詞邊界:
x <- "Happy 2022 New 01 years!"
num <- gsub('.*\\b(\\d )\\b.*$', '\\1', x)
num
[1] "01"
這里的挑戰是我們很想使用一個懶惰的點來停在第一個數字處,例如.*?(\\d ).*。但問題是現在我們將停在第一個數字,盡管我們想要最后一個。所以,貪點是合適的,字邊界迫使正則運算式捕獲整個最終數字。
uj5u.com熱心網友回復:
這可以作業:
(\d )[^\d]*$
https://regex101.com/r/DHrttA/1
在您的解決方案中,我認為問題在于第一個.*是貪婪的,因此它會跳過所有可能的內容。
uj5u.com熱心網友回復:
使用的解決方法 strsplit
> tail(strsplit(x, "\\D ")[[1]], 1)
[1] "01"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/403205.html
標籤:
