求助:如何用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!":无法匹配_20这类_开头的时段- 针对
_\d+的regsub:会出现错误包裹(如05 06!_07_08...)
通用解决方案
使用以下Tcl regsub命令即可覆盖所有场景:
regsub -all {((?:_\d+|\d+)(?:_\d+)*)} $string "!\1!"
正则表达式解析
(?:_\d+|\d+):匹配时段的起始部分,支持两种格式:_+数字,或纯数字(?:_\d+)*:匹配后续任意数量的_+数字片段,确保整个连续时段被完整捕获- 整个匹配内容作为分组
\1,替换为!\1!实现包裹
内容的提问来源于stack exchange,提问作者Hugo Simões
相关产品推荐
相关产品推荐

