2016-03-07 107 views
2

我需要刪除字符串中的所有非字母字符和數字除了-_除去大部分從字符串非字母字符的elisp

對於許多語言中流行的解決方案是使用類似這個[^\\w\\-_]由於某些原因,與replace-regexp-in-string一起使用時,該表達式會刪除所有內容。
雖然\\W去除一切,但字母和數字如預期:

(message (replace-regexp-in-string "\\W" "" "Set AA053 Лыв № foo_bar (設)")) 

將輸出:因爲我需要保留的非拉丁字符SetAA053Лывfoobar設

a-zA-Z0-9不會解決我的問題。

謝謝!

+1

我覺得[這篇文章](http://emacs.stackexchange。com/questions/8261/how-to-determine-if-the-current-character-is-a-letter)幾乎可以回答你的問題。 –

+0

我發佈了基於我刪除的評論的擴展答案。 –

回答

2

的POSIX類是特定於語言環境,並根據該documentation

‘[:alnum:]’
此任何字母或數字相匹配。 (目前,對於多字節字符,它匹配任何具有單詞語法的字符。
‘[:alpha:]’
這匹配任何字母。 (目前,多字節字符,它匹配任何有單詞的語法

這就是爲什麼匹配不是字母,數字的任何字符,或下劃線/連字符,你可以使用一個negated character class解決方法:

打開方括號後打字插入否定字符類。結果是字符類匹配不在字符類中的任何字符。

所以,是的,你可以在字符類的末尾使用

"[^[:alnum:]_-]" 
^^   ^

或者

"[^[:alpha:][:digit:]_-]" 

連字符由正則表達式引擎視爲一個連字符,沒有任何範圍定義運算符。

如果您不在乎_並且想要替換它,請從字符類中刪除。

1

隨着@幫助wiktorstribiżew我找到了正確的正則表達式:

[^[:alnum:]-_]

詳見Character Classes

相關問題