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