想知道如何匹配特定的字符串-TCL regexp

时间:2020-06-19 03:33:22

标签: match tcl

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_ballAB_10_100_a_b_c的正则表达式是什么?上面的正则表达式似乎与DIGIT相匹配?

我希望它先匹配[base_ball or base_bat],然后再匹配[ABC_10_100, CDE_20_200]

1 个答案:

答案 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]

应该足够了。

splitlrangejoin

的文档

如果您仍然想使用regexp,那么我建议您阅读re_syntax,该表达式的确取决于很多事情。可以使用许多不同的表达式来处理您的数据,但是最好的表达式只能通过了解数据和边缘情况来制作。从我可以假设的角度来看,我猜可能是这样的:

regexp {^([^_]+_[^_]+)_(.+)$} $k3 - bb digit

[^_]+表示除_以外的任何字符都将被匹配,从而使上述匹配:

  • ^-字符串的开头
  • [^_]+-任何非_ s
  • _-一个_
  • [^_]+任何非_ s
  • _一个_
  • .+-任何字符
  • $-字符串结尾