在Emacs中使用正则表达式删除冒号,实现silva:2018转silva2018
在Emacs中用正则替换去掉冒号的解决方案
嗨,刚好我对Emacs的正则替换挺熟的,来帮你解决这个问题!
你之前用[a-z]:[0-9]匹配的话,只能覆盖单个字母+冒号+单个数字的情况(比如a:2),但你的目标是像silva:2018这种多个字母+冒号+多个数字的模式,而且要保留前后的字符、删掉中间的冒号,这时候就得用捕获组来实现啦。
具体步骤如下:
- 先打开你要处理的文件,按下快捷键
C-M-%(也就是Ctrl+Alt+%),这会调用Emacs的正则替换命令query-replace-regexp。 - 当Emacs提示你输入“正则表达式”时,输入:
解释一下这个正则:\([a-z]+\):\([0-9]+\)\([a-z]+\):用捕获组\( \)把一个或多个小写字母([a-z]+)包起来,后面可以用\1引用这部分内容::精准匹配中间的冒号\([0-9]+\):同样用捕获组把一个或多个数字包起来,后面用\2引用
- 接下来Emacs会提示输入“替换字符串”,输入:
这里\1\2\1就是前面捕获到的字母部分,\2是数字部分,把它们直接拼接起来就自动去掉了中间的冒号。 - 之后你可以按这些快捷键灵活操作替换:
y:替换当前匹配的内容,自动跳到下一个匹配项n:跳过当前匹配,不做替换!:直接替换所有匹配的内容,不用逐个确认q:随时退出替换操作
如果你的文本里可能有大写字母(比如Silva:2018),可以把正则里的[a-z]+改成[a-zA-Z]+,或者用Emacs更通用的字符类写法[[:alpha:]]+来匹配所有字母;数字部分也可以换成[[:digit:]]+,适配更多场景:
\([[:alpha:]]+\):\([[:digit:]]+\)
内容的提问来源于stack exchange,提问作者sbac
相关产品推荐
相关产品推荐

