Vim:替换行中所有非字母非数字和非'-'字符

时间:2018-09-01 08:23:59

标签: regex vim

我最近开始使用vim,并做了一些尝试来解决该问题。 所以我有一个字符串,例如"I'm 20 years old - and you?",我需要从这个'I_m_20_years_old_-_and_you_'

中获取

在Java中,像这样的[^a-Z0-9\-]+似乎很简单,但是我无法在Vim中获得类似正则表达式的工作 我已经尝试过:26s/\(\W\)/_/g,但是它也删除了所有的'-'。 如何在正则表达式中添加“而不是-”?

谢谢!

3 个答案:

答案 0 :(得分:3)

您尝试:26s/[^a-Z0-9-]+/_/g的问题是a-Z,这不是有效范围。应该是a-zA-Z

({A-z会“起作用”,但是如果您查看ASCII table,它还会包含[\]^_`,而不仅仅是字母。)

下一个问题是+不是vim中的正则表达式元字符(至少不是默认情况下)。 [^a-zA-Z0-9-]+会寻找一个非字母数字的非-字符,后跟原义的+。它必须改为\+

这使我们s/[^a-zA-Z0-9-]\+/_/g有效。

答案 1 :(得分:2)

根据http://vimregex.com/,应该是这样

s/[^a-zA-Z0-9-]\+/_/g

答案 2 :(得分:0)

转义-+

:s/[^a-zA-Z0-9\-]\+/_/g