Tclsh:如何通过regexp获得字符串的第一次出现?

时间:2013-11-28 12:27:25

标签: regex tcl

我有一个包含多个模式的字符串。我需要从字符串中提取第一个模式。

即:

我的模式:

ABC : 1
XXX : 3
YYY : 4
ZZZ : 9

ABC : 3
XXX : 4
YYY : 6
ZZZ : 7

我想根据为ABC值提供的值提取块。 如果我将ABC值设为1,则输出应为:

ABC : 1
XXX : 3
YYY : 4
ZZZ : 9

我试过了,

set ABCVal 1

regexp "ABC\[ \]+:\[ \]+$ABCVal(.*)\[^ABC\]" $buffer

这匹配整个缓冲区。

3 个答案:

答案 0 :(得分:2)

我首先将文本拆分为空白行分隔单元,然后在该列表中搜索模式:

set text {ABC : 1
XXX : 3
YYY : 4
ZZZ : 9

ABC : 3
XXX : 4
YYY : 6
ZZZ : 7}
package require textutil::split
set blocks [textutil::split::splitx $text {\n{2,}}]
set abc 3
set index [lsearch -regexp $blocks "^ABC : $abc\\y"]
puts [lindex $blocks $index]
ABC : 3
XXX : 4
YYY : 6
ZZZ : 7

我使用regexp \y断言,因此“^ ABC:3”与文字“ABC:345”不匹配

答案 1 :(得分:0)

if {[regexp "(?p)^ABC : $ABCval(?=\n).*?(?=\n\n|$(?!.))" $input]} { ...

答案 2 :(得分:0)

试试这个,

package require textutil
set new [textutil::splitx $buf {(?n)^\s*\n}]
set index [lsearch -regexp $new "ABC : $ABCVal"]
puts [lindex $new $index]

这将给出结果 ABC:3 XXX:4 YYY:6 ZZZ:7