我知道你可以找到一个字符串并将其后的所有内容放入变量中,使用TCL和正则表达式,如下所示
regexp "Shipping \(\[^\f]+)" $VarWithWholePage match shipinfo;
但是可以将字符串前的所有内容放入变量吗?
例如。
句号1.
句号2.
句号3.
句号4.
航运
句号5。
我的例子是"第5句。"进入shipinfo
,但我希望能够放置
句号1.
句号2.
句号3.
句号4。
进入另一个变量。
答案 0 :(得分:0)
regexp "\(.*\)Shipping \(\[^\f]+)" $VarWithWholePage match before after;
应将文字放在" Shipping"之前。在before
和after
之后的部分。
P.S。我不确定您使用^\f
的原因,但如果您有充分的理由可以在第一个子表达式中使用它。
答案 1 :(得分:0)
但是可以将字符串前的所有内容放入变量吗?
最简单的方法是让regexp
告诉你匹配的索引而不是匹配的子字符串。然后,您可以使用string range
获取所需的部分。
regexp -indices "Shipping \(\[^\f]+)" $VarWithWholePage match shipinfo
此时,match
和shipinfo
将有一对数字,用于指示输入字符串中匹配发生的确切位置。 如果匹配成功。
# Now we can get the bits before (and after) the match with simple operations
set beforeMatch [string range $VarWithWholePage 0 [expr {[lindex $match 0] - 1}]]
set afterMatch [string range $VarWithWholePage [expr {[lindex $match 1] + 1}] end]
# Convert the string ranges into the matched substrings so that your code still works
set match [string range $VarWithWholePage {*}$match]
set shipinfo [string range $VarWithWholePage {*}$shipinfo]
脚注:您的RE将被惯用地写为{Shipping ([^\f]+)}
,因为将正则表达式放在大括号中通常是一个非常好的主意。它反击反斜杠。