tcl - 如何删除单个字母/数字
问题描述
我想删除的变量中有单个字母和数字
示例输入:
USA-2019-1-aoiwer
USA-A-jowerasf
BB-a_owierlasdf-2019
flsfwer_5_2015-asfdlwer
期望的输出:
USA-2019--aoiwer
USA--jowerasf
BB-_owierlasdf-2019
flsfwer__2015-asfdlwer
我的代码:
bind pub "-|-" !aa proc:aa
proc proc:aa { nick host handle channel arg } {
set line [lindex $arg 0]
set line [string map {[a-z] """} $line]
set line [string map {[0-9] """} $line]
putnow "PRIVMSG $channel :$line"
}
不幸的是,这不起作用,我没有其他想法
问候
解决方案
string map
如果可行,将删除所有小写字母和数字。但是,您也有不平衡的引号,这会在 proc 解析时导致语法错误。
我建议使用regsub
. 然而,困难的部分是获得适当的表达来完成任务。我将提出以下建议:
bind pub "-|-" !aa proc:aa
proc proc:aa { nick host handle channel arg } {
set line [lindex $arg 0]
regsub -nocase -all {([^a-z0-9]|\y)[a-z0-9]([^a-z0-9]|\y)} $line {\1\2} line
putnow "PRIVMSG $channel :$line"
}
基本上([^a-z0-9]|\y)
匹配一个非字母数字的字符,或一个单词边界(例如,如果可以匹配,它将在句子的开头匹配,或者在句尾匹配),并存储它(这是括号的目的) .
匹配的组按从 1 开始的顺序存储,因此在 的替换部分中regsub
,我将不应该替换的部分放回原处。
以上应该可以正常工作。
从技术上讲,您可以用稍微不同的表达方式变得更花哨:
regsub -nocase -all {([^a-z0-9]|\y)[a-z0-9](?![a-z0-9])} $line {\1} line
它使用负前瞻 ( (?! ... )
)。
无论如何,如果您确实想更深入地了解,我建议您阅读有关正则表达式语法的手册
推荐阅读
- spring-boot - lateinit 属性 vkUserRepository 尚未初始化。为什么?
- node.js - NodeJS 护照如何将项目从 Google+ 登录迁移到 Google 登录?
- scala - Spark ML Params 没有定义 setter - 为什么?
- c# - 在索引触发器上停止旋转
- vba - Word VBA搜索某些单词的句子
- office-ui-fabric - 如何隐藏 office-ui-fabric 中 GroupedList 标头的计数?
- sql - 选择随机 ID 的函数
- makefile - make[1]: *** 等待未完成的工作
- c - 将元素从列表更改为结尾
- java - 如何修复java中的“java.net.SocketException”错误