regex - 如何在 tcl 中使用正则表达式提取数组索引

标签 regex tcl

我有一个范围字符串,其形式为 [Numeric1] 或 [Numeric1:Numeric2] 括号也是字符串的一部分。

我想要一个正则表达式为我提供开始索引,而另一个正则表达式为我提供结束索引,无论输入字符串如何。

我已经成功做到了,但我只是想知道是否有更好的方法。 这是我的做法

#[5]
set range_1 "\[5\]"
#[7:9]
set range_2 "\[7:9\]"

set reg_exp_for_start_index {\[([0-9]*)\]|\[([0-9]*):[0-9]*\]}
set reg_exp_for_end_index   {\[([0-9]*)\]|\[[0-9]*:([0-9]*)\]}

set iStart1 [regsub $reg_exp_for_start_index $range_1 {\1\2}]
puts "Start index for Range 1: $iStart1"

set iEnd1 [regsub $reg_exp_for_end_index $range_1 {\1\2}]
puts "End index for Range 1: $iEnd1"

set iStart2 [regsub $reg_exp_for_start_index $range_2 {\1\2}]
puts "Start index for Range 2: $iStart2"

set iEnd2 [regsub $reg_exp_for_end_index $range_2 {\1\2}]
puts "End index for Range 2: $iEnd2"

我得到的预期输出是

Start index for Range 1: 5
End index for Range 1: 5
Start index for Range 2: 7
End index for Range 2: 9

我不喜欢的是我使用了or (|) 我必须将字符串连接为 {\1\2}。

最佳答案

改用regexp

set range {[5]}
regexp -- {\[([0-9]*)(?::([0-9]*))?\]} $range -> start end
puts "Range: $range"
puts "Start: $start"
puts "End:   $end"

此外,您可能不希望使用 007 等格式的数字作为范围,或空字符串。

regexp -- {\[([1-9]\d*)(?::([1-9]\d*))?\]} $range -> start end

这是an Ideone demo .

最后,-- 简单地结束开关。这是我的一个习惯。 -> 只是一种审美技巧,依赖于 -> 是 Tcl 中有效标识符的事实。它也可能是:

regexp -- {\[([1-9]\d*)(?::([1-9]\d*))?\]} $range match start end

关于regex - 如何在 tcl 中使用正则表达式提取数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17081146/

相关文章:

java - 时间正则表达式问题

c - 如何更改 NS-2 中数据包 tcp header 中的标志?

python - 使用多个分隔符拆分字符串,并保留*一些*分隔符,但不是全部

python - RegEx:列出在 python 中构建示例代码的所有可能性

regex - sed 中 [ ] 内的 anchor

tcl - 如何让proc更有效?

tcl - 如何将包含 '<'的命令行参数传递给 'exec'

tcl - NS2 NAM 不显示传输

c++ - 如何将 Boost::shared_ptr<T> 暴露给 Tcl + SWIG 接口(interface)文件?

regex - 如何在每个单词的开头添加一个字符?