我有一个存储在变量$ res中的html文档。在该文档中,存在一个特定的HTML标签,其中包含“' house”字样。
我希望显示包含单词house的整行。我如何使用正则表达式来做到这一点?我读过这个:https://www.tcl.tk/man/tcl8.4/TclCmd/regexp.htm
但是我找不到我想要的东西。
set grepfw "house"
set fwversion [regexp -inline "$grepfw" $res]
puts $fwversion
现在,如果我删除-inline标志,我会得到" 1"返回并且如果启用了-inline标志,我只会获得' house'回。
答案 0 :(得分:0)
由于您希望进行线路匹配匹配,请将-line
选项传递给regexp
。此外,您需要在正则表达式的外部添加一些额外的位,以表示您要匹配行而不仅仅是单词。最后,您需要考虑是否要只单词house
。 lighthouseman
会成为理想的匹配吗?如果没有,则需要字边界约束(即Tcl的RE子语言中的\y
)。
set word "house"
# Backslashes are doubled: we're in double quotes here
# Use [lindex … 0] to strip one (unwanted here) layer of list-ish-ness
set fwversion [lindex [regexp -inline -line "^.*\\y$word\\y.*$" $res] 0]
puts $fwversion
请注意,通常你不应该将正则表达式放在双引号中,因为这意味着你需要添加大量的反斜杠,而且这两者都难以阅读且容易出错。这是唯一的例外:我们正在动态构建正则表达式。虽然当然还有其他选择。例如:
set RE [format {^.*\y%s\y.*$} $word]
set fwversion [lindex [regexp -inline -line $RE $res] 0]
set RE [string cat {^.*\y} $word {\y.*$}]
set fwversion [lindex [regexp -inline -line $RE $res] 0]
我非常喜欢将整个正则表达式放在一个变量中。这让我给RE命名,它可以帮助(简要地!)在一个更大的程序中记录复杂的匹配器。