【问题标题】:Extracting integer from a string in TCL从 TCL 中的字符串中提取整数
【发布时间】:2014-06-30 18:36:43
【问题描述】:

我在这个模式中有一个字符串:

2(some_substring) -> 3(some_other_substring)

现在这些数字可以是任何数字。

我认为answer 可以解决问题。但它在一个变量中给出了所有整数。我希望它们处于不同的变量中,以便我可以分析它们。我们可以拆分它吗?但是拆分会导致问题:

如果数字不是个位数,则拆分错误。

还有其他方法吗?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    您可以使用它的变体:您可以将所有数字字符提取到一个列表中,而不是删除非数字字符:

    set text {2(some_substring) -> 3(some_other_substring)}
    set numbers [regexp -all -inline -- {[0-9]+} $text]
    puts $numbers
    # => 2 3
    

    要获取每个数字,您可以使用lindex

    puts [lindex $numbers 0]
    # => 2
    

    或者在 8.5 及更高版本中,您可以使用 lassign 将它们分配给特定的变量名称:

    lassign $numbers first second
    puts $first
    # => 2
    puts $second
    # => 3
    

    regexp -all -inline -- {[0-9]+} $text 中,-all 提取所有匹配项,-inline 将匹配项放入列表中,-- 结束选项,[0-9]+ 匹配至少一个整数。

    【讨论】:

    • 我可以使用:set no1 [lindex $numbers 0]set no2 [lindex $numbers 1] 吗?
    • 是的,那行得通。我也可以set他们。谢谢
    【解决方案2】:

    为了扩展 Jerry 的答案,如果数字可以出现在括号内,则仅提取紧跟左括号的数字的正则表达式是:{\d+(=\()}

    % set text {2(some_6substring) -> 3(some_other_5substring)}
    2(some_6substring) -> 3(some_other_5substring)
    % lassign [regexp -all -inline {\d+(?=\()} $text] first second
    % set first
    2
    % set second
    3
    

    这假设您没有嵌套括号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多