String Tcl-如何替换?与-
(你会认为这很容易,但我被难倒了。) 我正在将iOS便笺转换为文本文件,只要有列表或项目符号,便笺就会包含“0.”和“?”String Tcl-如何替换?与-,string,tcl,special-characters,String,Tcl,Special Characters,(你会认为这很容易,但我被难倒了。) 我正在将iOS便笺转换为文本文件,只要有列表或项目符号,便笺就会包含“0.”和“?” This was a bulleted list ? item 20 ? Item 21 ? Item 22 我很难更换“?” 我不想在句末用一个合法的问号来代替, 但我想用“-”替换“?”项目符号(最好是行中的任何位置,而不仅仅是开始) 我尝试了这些搜索-没有运气 set line "? item 20" set index_bullet [string first "
This was a bulleted list
? item 20
? Item 21
? Item 22
我很难更换“?”
我不想在句末用一个合法的问号来代替,
但我想用“-”替换“?”项目符号(最好是行中的任何位置,而不仅仅是开始)
我尝试了这些搜索-没有运气
set line "? item 20"
set index_bullet [string first "(\s|\r|\n)(\?)" $line]
set index_bullet [string first "(!\w)(\?)" $line]
set index_bullet [string first ^\? $line]
这是可行的,但它可以匹配任何问号
set index_bullet [string first \? $line]
有人知道我做错了什么吗?
如何查找问号项目符号并将其替换为“-”
事先非常感谢我想好了。
我分两步做:
1) 首先找到“?”
2) 然后过滤掉“?”那不是子弹
set index_question_mark [string first "\w\?" $line]
我有一个解决方案,但请张贴,如果你有更好的方式做这件事。
谢谢 用于指示列表项的字符可能是行中的第一个字符或可选空格后的第一个字符。要匹配行首的问号,请执行以下操作:
string match {\?*} $line
或
大括号或双反斜杠可防止问号被视为字符串匹配
元字符
要在可选空格后查找问号,请执行以下操作:
string match {\?*} [string trimleft $line]
如果找到匹配项,该命令将返回1,如果未找到匹配项,则返回0
要首先使用字符串执行此操作,请使用
if {[string first ? [string trimleft $line]] eq 0} ...
但是在这种情况下,请记住从string first
返回的索引不是问号的真实位置。(使用
=
而不是eq
(如果您有较旧的Tcl)
当您确定该行在第一个非空白位置包含问号时,一个简单的
set line [regsub {\?} $line -]
将执行单个替换,无论它位于何处
文件:
,
,
如果您真的想替换一个问号,其中有一个描述规则的正则表达式,那么regsub
命令是正确的方法。(string first
命令仅查找文字子字符串。string match
命令使用全局规则。)在这种情况下,我们将使用-all
选项,以便替换每个实例:
set line "? item 20"
set replaced [regsub -all {(\s|^)\?(\s)} $line {\1-\2}]
puts "'$line' --> '$replaced'"
# Prints: '? item 20' --> '- item 20'
在Tcl中使用正则表达式的主要技巧是,尽可能地将REs及其替换项放在大括号中,这样您就可以使用Tcl元字符(例如,反斜杠或方括号),而不必太费劲
另外,\s
默认情况下将匹配一个换行符。如果您希望这些参数是正则表达式,1)字符串优先
不使用正则表达式,2)由于双引号,它们被作为字符串“?”和“w”传递。非常感谢您的回答,Peter!还有一个问题。我真的不明白字符串匹配{\?*}为什么我需要星号?如果?
是行中的第一个字符,那么$index\u bullet
的值将为0
。在字符串匹配模式的规则中(我应该提到的是,当我进入计算机时,我会尝试解决这个问题,基本上它们类似于Unix全局模式)*表示与正则表达式模式中的.*相同。使用字符串匹配时,不能进行部分匹配,因此*是必需的。对于stringfirst,它返回字符串中查找的字符串开始的位置,如果不存在,则返回-1。它不是布尔值。没有人说它是布尔值。OP最初的想法是先使用字符串
,只要检查返回值是否为0(即目标字符串中的第一个位置)就可以了。@BradLanam:我知道。既然你提到了它,我想澄清它与我的建议之间的关系是个好主意。谢谢!这正是我想要的。成功了!:D
set line [regsub {\?} $line -]
set line "? item 20"
set replaced [regsub -all {(\s|^)\?(\s)} $line {\1-\2}]
puts "'$line' --> '$replaced'"
# Prints: '? item 20' --> '- item 20'