如何使用TCL将段落或页面拆分为2个变量?

时间:2016-10-16 05:04:02

标签: regex string tcl

我知道你可以找到一个字符串并将其后的所有内容放入变量中,使用TCL和正则表达式,如下所示

regexp "Shipping \(\[^\f]+)" $VarWithWholePage match shipinfo;

但是可以将字符串前的所有内容放入变量吗?

例如。

  

句号1.
  句号2.
  句号3.
  句号4.
  航运
  句号5。

我的例子是"第5句。"进入shipinfo,但我希望能够放置

  

句号1.
  句号2.
  句号3.
  句号4。

进入另一个变量。

2 个答案:

答案 0 :(得分:0)

regexp "\(.*\)Shipping \(\[^\f]+)" $VarWithWholePage match before after;

应将文字放在" Shipping"之前。在beforeafter之后的部分。

P.S。我不确定您使用^\f的原因,但如果您有充分的理由可以在第一个子表达式中使用它。

答案 1 :(得分:0)

  

但是可以将字符串前的所有内容放入变量吗?

最简单的方法是让regexp告诉你匹配的索引而不是匹配的子字符串。然后,您可以使用string range获取所需的部分。

regexp -indices "Shipping \(\[^\f]+)" $VarWithWholePage match shipinfo

此时,matchshipinfo将有一对数字,用于指示输入字符串中匹配发生的确切位置。 如果匹配成功。

# 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]+)},因为将正则表达式放在大括号中通常是一个非常好的主意。它反击反斜杠。