Regex Tcl:包装regsub和字符串映射***寻找副作用***

Regex Tcl:包装regsub和字符串映射***寻找副作用***,regex,tcl,Regex,Tcl,我用四个新命令制作了以下包,以简化regsub和map的使用。我已经使用这些命令很长一段时间了,到目前为止效果很好。我想知道代码是否有任何弱点,可能会在将来产生不希望的结果或错误 regdel varName args(从varName regex匹配args中删除) mapdel varName args(从varName字符串匹配args中删除) regrep varName exp repl(用repl替换varName中的exp) maprep varName string repl(用

我用四个新命令制作了以下包,以简化
regsub
map
的使用。我已经使用这些命令很长一段时间了,到目前为止效果很好。我想知道代码是否有任何弱点,可能会在将来产生不希望的结果或错误

regdel varName args(从varName regex匹配args中删除)

mapdel varName args(从varName字符串匹配args中删除)

regrep varName exp repl(用repl替换varName中的exp)

maprep varName string repl(用repl替换varName中的字符串)

使用regdel删除数字 使用mapdel删除数字 使用regrep替换空白字符 使用maprep替换空白字符 包装代码:

package provide myregex 1.0

proc regdel {ref args} {
    upvar 1 $ref var
    foreach match $args {
        regsub -all $match $var "" var
    } 
}

proc mapdel {ref args} {
    upvar 1 $ref var
    foreach match $args {
        set var [string map [list "$match" ""] $var]
    } 
}

proc regrep {ref match repl} {
    upvar 1 $ref var 
    regsub -all $match $var $repl var
}
proc maprep {ref match repl} {
    upvar 1 $ref var
    set var [string map [list "$match" "$repl"] $var]
}

为了避免冲突,我会将您的进程放在命名空间中:

然后,当您使用它时:

package require myregex

myregex::mapdel file foo bar baz

# or, you decide the risk of collisions in the global namespace
namespace import myregex::*
mapdel file foo bar baz
我不太喜欢你的程序名:
regrep
看起来像
regrep
。考虑子命名空间

namespace eval myregex {
    namespace export regex map
}

namespace eval myregex::regex {
    proc del args ...
    proc rep args ...
}

namespace eval myregex::map {
    proc del args ...
    proc rep args ...
}
然后


使用Donal的合奏建议:

namespace eval myregex {
    namespace export regex map
    namespace eval regex {
        proc del {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            regsub -all [join $args "|"] $var "" var
        }
        proc rep {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            foreach {pattern replacement} $args {
                regsub -all $pattern $var $replacement var
            }
        }
        namespace ensemble create
        namespace export *
    }
    namespace eval map {
        namespace ensemble create
        proc del {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            foreach substr $args {
                lappend map $substr ""
            }
            set var [string map $map $var]
        }
        proc rep {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            set var [string map $args $var]
        }
        namespace ensemble create
        namespace export *
    }
}
然后

输出

heo wor
heLLO wOrLd
heo wor
heLLO wOrLd

我建议制作合奏。
package provide myregex 1.0
namespace eval myregex {
    namespace export regdel mapdel regrep maprep
    # your code here
}
package require myregex

myregex::mapdel file foo bar baz

# or, you decide the risk of collisions in the global namespace
namespace import myregex::*
mapdel file foo bar baz
namespace eval myregex {
    namespace export regex map
}

namespace eval myregex::regex {
    proc del args ...
    proc rep args ...
}

namespace eval myregex::map {
    proc del args ...
    proc rep args ...
}
namespace import myregex::*
map::del file foo bar baz
regex::rep file hello world
namespace eval myregex {
    namespace export regex map
    namespace eval regex {
        proc del {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            regsub -all [join $args "|"] $var "" var
        }
        proc rep {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            foreach {pattern replacement} $args {
                regsub -all $pattern $var $replacement var
            }
        }
        namespace ensemble create
        namespace export *
    }
    namespace eval map {
        namespace ensemble create
        proc del {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            foreach substr $args {
                lappend map $substr ""
            }
            set var [string map $map $var]
        }
        proc rep {varname args} {
            if {[llength $args] == 0} return
            upvar 1 $varname var
            set var [string map $args $var]
        }
        namespace ensemble create
        namespace export *
    }
}
namespace import myregex::*

set str "hello world"; regex del str l d;     puts $str
set str "hello world"; regex rep str l L o O; puts $str
set str "hello world"; map del str l d;       puts $str
set str "hello world"; map rep str l L o O;   puts $str
heo wor
heLLO wOrLd
heo wor
heLLO wOrLd