处理带有小时数的行并附上以供稍后处理

问题描述 投票:0回答:1

我有一行文本,其中包含时间列表,我需要执行代表日光的封装。 以下是一些示例以及我希望 regsub 如何输出它:

"  06 07_08_09_10_11_12_13_14_15_16_17_18_19_20 21 22 23 Hour"
-> "  06 !07_08_09_10_11_12_13_14_15_16_17_18_19_20! 21 22 23 Hour"
"  19_20 21 22 23 00 01 02 03 04 05 06_07_08_09_10_11_12 Hour"
-> "  !19_20! 21 22 23 00 01 02 03 04 05 !06_07_08_09_10_11_12! Hour"
"  _20 21 22 23 00 01 02 03 04 05 06 07 08_09_10_11_12_13 Hour"
-> "  !_20! 21 22 23 00 01 02 03 04 05 06 07 !08_09_10_11_12_13! Hour"

我尝试使用

regsub -all {(\d+_\d+)} $string "!\\1!" 
regsub -all {_\d+}......
但没有快乐。第一种 regusb 可以工作,但是当该行以“_something”开头时,它会忽略它。虽然第二个也可以工作,但中间就像... 05 06!_07_08... 我需要一个regsub来统治它们。是否可以? 任何帮助/提示表示赞赏。

design-patterns tcl regsub
1个回答
0
投票

我怀疑你会得到一些接近正确的东西:

regsub -all {\y(?!_+\y)[\d_]*_[\d_]*\y} $string !&!

这里的关键技巧是

\y
是单词边界约束...并且
_
和数字都是单词字符。

我们还使用负前瞻约束(

(?!_+\y)
)来停止匹配仅
_
序列的事物,这是我怀疑您不想要的一种情况。有时这是最简单的方法。 (如果没有
\y
,前瞻约束将无法工作,因为它们总是非贪婪地匹配......)

© www.soinside.com 2019 - 2024. All rights reserved.