无法获取在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
有人能帮我把它修好吗?
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!" }
文件:
string first
string match
2izufjch2#
当你在Tcl中把一个文字值放在大括号中时,你禁用了其中的 all 替换。这意味着您正在查找的RE * 字面上 * 只是^"${cell_pattern}".+,并且不匹配任何内容(因为字符串结尾匹配$后面不能有任何内容并得到满足)。我猜你想在这里进行变量替换。最简单的方法,特别是RE不包含反斜杠或方括号(其他Tcl元异步),是将整个字符串放在双引号中,就像这样:
^"${cell_pattern}".+
$
regexp "^${cell_pattern}.+" $line_pattern match
或者:
regexp "^${cell_pattern}(.+)" $line_pattern -> match # Just captures the suffix
当然,此时您必须注意,被替换的字符串是一个正确的RE片段。这在你的例子中是正确的。在更复杂的情况下,使用string map和/或format来构建RE可能是有用的。但我倾向于认为,如果你变得那么复杂,那么你就有了太复杂的RE。您在这里所做的 * 特定 * 匹配也可以用string first、string range和string length来完成,但这样做只会让稍微复杂一些的事情变得非常烦人。更复杂的事情可能需要使用解析器生成器。
string map
format
string range
string length
2条答案
按热度按时间of1yzvn41#
Tcl中的大括号就像shell中的单引号:变量不被替换。
您的模式不是正则表达式。您可能只想检查字符串是否以前缀开头。
文件:
string first
string match
2izufjch2#
当你在Tcl中把一个文字值放在大括号中时,你禁用了其中的 all 替换。这意味着您正在查找的RE * 字面上 * 只是
^"${cell_pattern}".+
,并且不匹配任何内容(因为字符串结尾匹配$
后面不能有任何内容并得到满足)。我猜你想在这里进行变量替换。最简单的方法,特别是RE不包含反斜杠或方括号(其他Tcl元异步),是将整个字符串放在双引号中,就像这样:
或者:
当然,此时您必须注意,被替换的字符串是一个正确的RE片段。这在你的例子中是正确的。
在更复杂的情况下,使用
string map
和/或format
来构建RE可能是有用的。但我倾向于认为,如果你变得那么复杂,那么你就有了太复杂的RE。您在这里所做的 * 特定 * 匹配也可以用
string first
、string range
和string length
来完成,但这样做只会让稍微复杂一些的事情变得非常烦人。更复杂的事情可能需要使用解析器生成器。