regex Tcl正则表达式变量不匹配,如何修复?

ztyzrc3y  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(209)

无法获取在regexp中工作的变量
各位Maven:
我试图在tcl中的regexp中使用一个变量,但无法使其工作。在输入数据和regexp模式中,我尝试使用

set line_pattern ac_E13Q_DFLP_B_eqCcell_10_022
set cell_pattern ac_E13Q_DFLP_B_eqCcell

regexp {^"${cell_pattern}".+} $line_pattern match

有人能帮我把它修好吗?

of1yzvn4

of1yzvn41#

Tcl中的大括号就像shell中的单引号:变量不被替换。

regexp "^$cell_pattern.+" $line_pattern match

您的模式不是正则表达式。您可能只想检查字符串是否以前缀开头。

if {[string first $cell_pattern $line_pattern] == 0} {
    puts "starts with!"
}
# or
if {[string match "${cell_pattern}*" $line_pattern]} {
    puts "starts with!"
}

文件:

2izufjch

2izufjch2#

当你在Tcl中把一个文字值放在大括号中时,你禁用了其中的 all 替换。这意味着您正在查找的RE * 字面上 * 只是^"${cell_pattern}".+,并且不匹配任何内容(因为字符串结尾匹配$后面不能有任何内容并得到满足)。
我猜你想在这里进行变量替换。最简单的方法,特别是RE不包含反斜杠或方括号(其他Tcl元异步),是将整个字符串放在双引号中,就像这样:

regexp "^${cell_pattern}.+" $line_pattern match

或者:

regexp "^${cell_pattern}(.+)" $line_pattern -> match 
# Just captures the suffix

当然,此时您必须注意,被替换的字符串是一个正确的RE片段。这在你的例子中是正确的。
在更复杂的情况下,使用string map和/或format来构建RE可能是有用的。但我倾向于认为,如果你变得那么复杂,那么你就有了太复杂的RE。
您在这里所做的 * 特定 * 匹配也可以用string firststring rangestring length来完成,但这样做只会让稍微复杂一些的事情变得非常烦人。更复杂的事情可能需要使用解析器生成器。

相关问题