2

我有一个范围字符串,格式为 [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

我不喜欢使用或 (|) 并且必须将字符串连接为 {\1\2}。

4

2 回答 2

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

这是一个 Ideone 演示

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

regexp -- {\[([1-9]\d*)(?::([1-9]\d*))?\]} $range match start end
于 2013-06-13T07:56:48.553 回答
0

尝试这个:

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

这样,每个正则表达式只有一个捕获组。

于 2013-06-13T07:31:15.733 回答