如何删除一个字母/数字

时间:2019-05-28 12:51:24

标签: tcl eggdrop

我要删除的变量中有单个字母和数字

示例输入:

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"
}

不幸的是,这行不通,我没有其他想法

致谢

1 个答案:

答案 0 :(得分:1)

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

使用否定的前瞻((?! ... ))。

无论如何,如果您想进一步深入,建议阅读有关正则表达式语法的manual