2016-03-01 185 views
-2

我想要gsub一個字符串,它只包含字符和空格,例如字符串"to delete"。我曾經嘗試這樣做:如何使用正則表達式來匹配字母字符?

gsub('[^[:alpha:]$]',NA, "to delete", ignore.case=T) 

,但我得到的NA也當字符串包含數字,例如:

gsub('[^[:alpha:]$]',NA, "to 1 delete", ignore.case=T) 

有人能告訴我什麼,我做錯了什麼?謝謝。

+1

'gsub'是爲了替換其他字符串的字符串。你只是想匹配?那麼你可能想用'grep()'代替。否則你想要做什麼替換? – MrFlick

+0

'[:alpha:]'只表示'[a-zA-Z]'。它不包括'space'。 [檢查此](http://www.regular-expressions.info/posixbrackets.html) – 2016-03-01 04:42:35

+0

我想匹配,然後替換。我想用NA來替換字符串,比如「刪除」,但是我不希望諸如「to 1 delete」之類的字符串被替換。 還想知道爲什麼有人也投了票... – Dambo

回答

0

您的正則表達式只針對單個未錨定的括號表達式進行測試。這意味着任何具有任何字符的匹配括號表達式的字符串都將與正則表達式匹配。

您的括號表達式測試爲「不是字母不是美元」。這匹配很多東西,包括空格,數字和美元以外的所有標點符號。

這聽起來像你只想匹配整個只有字母和空白字符的字符串。爲了達到這個目的,你需要一個錨定的相乘括號表達式。

此外,您不需要gsub()爲此;您只需要sub(),因爲只能匹配整個輸入字符串的正則表達式不能在輸入字符串中多次匹配。

此外,您不需要ignore.case=T,因爲[:alpha:]字符類已經匹配所有字母,無論字母大小寫。

regex <- '^[[:alpha:][:space:]]*$'; 
sub(regex,NA,'to delete'); 
## [1] NA 
sub(regex,NA,'to 1 delete'); 
## [1] "to 1 delete" 
+0

感謝您的廣泛解釋。 – Dambo