How do I pattern match this in TCL?
set game1 base_ball_ABC_10_100_a_b_c
set game2 base_ball_CDE_20_200_d_e_f
set game3 base_bat_DEF_40_400_j_k_l
下面的regexp arg似乎不起作用,因为它最多可以匹配第一个数字(即:_10,_20)?
if { ![regexp {^([^0-9]+)(.*)$} $k3 - bb digit] } {
我想知道匹配base_ball
和AB_10_100_a_b_c
的正则表达式是什么?上面的正则表达式似乎与DIGIT
相匹配?
我希望它先匹配[base_ball or base_bat]
,然后再匹配[ABC_10_100, CDE_20_200]
。
答案 0 :(得分:2)
如果字符串中的下划线数量相等,并且所有需要始终位于第二个下划线之前和之后,则无需使用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]
应该足够了。
的文档如果您仍然想使用regexp,那么我建议您阅读re_syntax,该表达式的确取决于很多事情。可以使用许多不同的表达式来处理您的数据,但是最好的表达式只能通过了解数据和边缘情况来制作。从我可以假设的角度来看,我猜可能是这样的:
regexp {^([^_]+_[^_]+)_(.+)$} $k3 - bb digit
[^_]+
表示除_
以外的任何字符都将被匹配,从而使上述匹配:
^
-字符串的开头[^_]+
-任何非_
s _
-一个_
[^_]+
任何非_
s _
一个_
.+
-任何字符$
-字符串结尾