【发布时间】:2017-12-28 01:54:23
【问题描述】:
这个问题是关于了解 Vivado 中内置的 TCL 8.5 中特定正则表达式的行为,特别是 or-ing 两个正则表达式部分我得到了意想不到的结果:
我致力于使用正则表达式为命令行缩进一段文本。我的第一个想法是将每个newline 替换为newline 和 一些spaces(为清楚起见,在此处替换为X)以进行缩进,所以:
puts [regsub -all "\n" "foo\nBar\nBaz" "\nXX"]
foo
XXBar
XXBaz
这不会缩进第一行,以匹配我使用^的第一行:
puts [regsub -all "^" "foo\nBar\nBaz" "\nXX"]
XXfoo
Bar
Baz
现在应该只是将两个正则表达式部分与| 组合起来,但是我得到了我无法解释的输出:
puts [regsub -all "^|\n" "foo\nBar\nBaz" "\nXX"]
XXfoo
XX
XXBar
XX
XXBaz
额外的换行符和识别标记 (X) 来自哪里?为什么看起来我得到了两个替换?这是一个错误,还是我对正则表达式语法有一点不了解?
为了完整起见,这里是我现在使用的正则表达式puts [regsub -all -line "^" "foo\nBar\nBaz" "XX"]
【问题讨论】:
-
有趣的问题。顺便说一句,您可以使用
-line选项代替(?n)->set t [regsub -all -line "^" $string "XX"]。 IMO 更具可读性。 -
另外,
-linestop在这里就足够了,或者(?w)内联选项,"(?w)^"模式。-line或(?n)还修改了.的行为以及模式中未使用的否定括号表达式。 -
@glennjackman 不错,8.0 documentation 给我的印象是我无法将替换结果作为返回值,必须将其指定为变量。我同意你的版本更具可读性。
-
注 1) Tcl 8.0 已经有 20 多年的历史了,在现代 Tcl 中会有很多不同的工作方式,并且 2) 虽然我认识到问题是关于正则表达式的,但更好的解决方案是使用
::textutil::adjust::indent foo\nBar\nBaz XX或至少join [lmap line [split foo\nBar\nBaz \n] {format {XX%s} $line}] \n。