Вам не нужно использовать regexp
, если в строках одинаковое количество подчеркиваний, и если все, что вам нужно, всегда до и после второго подчеркивания:
set k3 {base_ball_ABC_10_100_a_b_c}
set parts [split $k3 "_"]
set part1 [join [lrange $parts 0 1] "_"]
# base_ball
set part2 [join [lrange $parts 2 end] "_"]
# ABC_10_100_a_b_c
Принимая ваш предыдущий вопрос к тому же, возможно, вам и не потребуется присоединяться, если вы подсчитываете только уникальные значения, поэтому, вероятно, будет достаточно выполнения
set k3 {base_ball_ABC_10_100_a_b_c}
set parts [split $k3 "_"]
set part1 [lrange $parts 0 1]
set part2 [lrange $parts 2 end]
.
Документы для split , lrange , join
Если вы все еще хотите использовать регулярное выражение, я бы посоветовал прочитать re_syntax, а выражение действительно зависит от многих вещей. Может быть много разных выражений, которые работают с вашими данными, но лучшее выражение можно создать, только зная данные и крайние случаи. Исходя из того, что я могу предположить, я предполагаю, что может сработать что-то вроде этого:
regexp {^([^_]+_[^_]+)_(.+)$} $k3 - bb digit
Где [^_]+
означает, что будет сопоставлен любой символ, кроме _
s, так что совпадение выше:
^
- начало строки [^_]+
- любое не _
s _
- одно _
[^_]+
любой не _
s _
один _
.+
- любые символы $
- конец строки