我有[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}。
答案 0 :(得分: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
最后,--
只是结束了切换。这是我的习惯。并且->
只是一种美学伎俩,依赖于->
是Tcl中的有效标识符这一事实。它也可以是:
regexp -- {\[([1-9]\d*)(?::([1-9]\d*))?\]} $range match start end
答案 1 :(得分:0)
试试这个:
set reg_exp_for_start_index {\[([0-9]*)(?::[0-9]*)?\]}
set reg_exp_for_end_index {\[(?:[0-9]*:)?([0-9]*)\]}
这样,每个正则表达式只有一个捕获组。