2016-03-07 120 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

相关问题