gpt4 book ai didi

regex - 在 regsub 中评估数学

转载 作者:行者123 更新时间:2023-12-01 12:41:53 24 4
gpt4 key购买 nike

我需要在 Tcl 中将字符串从二维数组转换为一维。

例如

lane_out[0][7]  -> lane_out[7]  
lane_out[1][0] -> lane_out[8]

初始字符串从文件中读取,修改并存储在另一个文件中。此外,输入文件有很多不同类型的字符串需要替换,因此用户在另一个文件中提供查找和替换正则表达式。

对于不需要额外计算的简单字符串,我已经成功地做到了这一点。但我需要帮助来执行表达式。我在想我可以让用户在文件中提供表达式并执行它,但我没有成功。

用户输入文件:

lappend userinput {\[(\d+)]\*$ *}
lappend userinput {\[(\d+)]\[(\d+)]$ [expr{\1*8+\2}]}

我的错误代码:

set line "lane_out[1][0]"
foreach rule $userinput {
foreach {find replace} [regexp -all -inline {\S+} $rule] break
regsub -all $find $line $replace line
set match [regexp -all -inline {expr{.*}} $line] #match = expr{1*8+0}
set val [$match] #supposed to execute what is in match
regsub expr{.*} $line $val line
}

最佳答案

您所做的事情非常复杂:您有一个输入文件、一组搜索/替换规则,并产生一些输出。但是,规则需要调用 expr

这是一个虚构的数据文件(data.txt):

lane_out[0][7] = "foo bar"
lane_out[1][0] = "foo bar"
lane_out[1][1] = "foo bar"
lane_out[2][0] = "foo bar"
lane_out[2][1] = "foo bar"

和规则文件 (rules.txt):

{\[(\d+)\]\[(\d+)\]} {\[[expr {\1 * 8 + \2}]\]}

这是我的脚本(search_replace.tcl):

package require Tclx

# Read the rules file
set rules {}
for_file line rules.txt {
lassign $line find replace
lappend rules $find $replace
}

# Read the data, apply rules
for_file line data.txt {
foreach {find replace} $rules {
regsub -all $find $line $replace line
set line [subst $line]
puts $line
}
}

输出:

lane_out[7] = "foo bar"
lane_out[8] = "foo bar"
lane_out[9] = "foo bar"
lane_out[16] = "foo bar"
lane_out[17] = "foo bar"

讨论

  • rules.txt 的格式:每行包含搜索和替换表达式,以空格分隔
  • 代码会翻译一行

    lane_out[2][1] = "foo bar"

    到:

    lane_out\[[expr {2 * 8 + 1}]\] = "foo bar"
  • 然后,subst 命令将其替换为:

    lane_out[17] = "foo bar" 
  • 棘手的部分是转义方括号,以便 expr 可以做正确的事情。

关于regex - 在 regsub 中评估数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23623555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com