在 TCL 中查找和删除特殊字符
find and delete special characters in TCL
我有特殊字符:
abc[1]
我想要找到模式 [:number:]
我希望它变成
abc_1_
如何找到模式[:number:]
我尝试使用 string match "*[*" $list
。但它不活跃
string match
命令并不是真正适合这项工作的工具。它不会告诉您它在哪里匹配的东西,[
是它的小匹配语言中的元字符(用于引入*
的限制形式)。
在你的情况下,你最好使用 regsub
:
regsub {\[(\d+)\]} $inputString {__}
例如:
puts [regsub {\[(\d+)\]} {abc[1]} {__}]
RE 本身是这样的:\[(\d+)\]
。这是一个文字 [
(反斜杠引号,因为它是 RE 元字符)、一个或多个数字的捕获子序列,以及一个文字 ]
(带反斜杠引号)。替代替换是 __
,一对 _
个字符,第一个(也是唯一一个)捕获的子序列位于它们之间。
如果一次要在一个字符串中进行多次替换,您可能需要 -all
选项才能 regsub
。
如果您希望摆脱一般的问题字符,regsub
是正确的方法。但是,可能需要一些操作才能获得正确的 RE。虽然有一些简化......
puts [regsub -all {\W+} {abc[1]} "_"]
那个实际上并没有按照你的要求去做......但它更像是许多人在这个领域提出问题时想要的,因为它改变了非所有序列- 字母数字字符转换为单个下划线(模数 _
本身有点奇怪)。
我有特殊字符:
abc[1]
我想要找到模式 [:number:]
我希望它变成
abc_1_
如何找到模式[:number:]
我尝试使用 string match "*[*" $list
。但它不活跃
string match
命令并不是真正适合这项工作的工具。它不会告诉您它在哪里匹配的东西,[
是它的小匹配语言中的元字符(用于引入*
的限制形式)。
在你的情况下,你最好使用 regsub
:
regsub {\[(\d+)\]} $inputString {__}
例如:
puts [regsub {\[(\d+)\]} {abc[1]} {__}]
RE 本身是这样的:\[(\d+)\]
。这是一个文字 [
(反斜杠引号,因为它是 RE 元字符)、一个或多个数字的捕获子序列,以及一个文字 ]
(带反斜杠引号)。替代替换是 __
,一对 _
个字符,第一个(也是唯一一个)捕获的子序列位于它们之间。
如果一次要在一个字符串中进行多次替换,您可能需要 -all
选项才能 regsub
。
如果您希望摆脱一般的问题字符,regsub
是正确的方法。但是,可能需要一些操作才能获得正确的 RE。虽然有一些简化......
puts [regsub -all {\W+} {abc[1]} "_"]
那个实际上并没有按照你的要求去做......但它更像是许多人在这个领域提出问题时想要的,因为它改变了非所有序列- 字母数字字符转换为单个下划线(模数 _
本身有点奇怪)。