2017-06-22 47 views
1

使用TCL,我想设置一个正则表达式来获取我的XML字符串中的数据。我提供的代码有一个我正在处理的示例字符串,正则表达式试图找到第一个右括号并保留数据,直到下一个打开的括号将其放入可变数字中。不幸的是我得到的输出是:“< RouteLabel> Hurdman <”而不是预期的“Hurdman”。任何帮助真的会被赞赏。TCL正则表达式传入变量

set direction(1) {<RouteLabel>Hurdman</RouteLabel>} 
regexp {^.*>(.*)<} $direction(1) number 
+0

它看起来就像你正在试图[解析与正则表达式XML(https://stackoverflow.com/a/1732454/301832)。不要这样做。使用tDOM包。 –

+0

我只用这个正则表达式解析XML数据的众所周知的单个字符串,简单地实现一个正则表达式来解析出这个实例中的数据要快得多。这就是说,你有什么好的tDOM包学习材料的建议吗? –

回答

1

这里的问题不是正则表达式,而是你如何使用它。

你需要的语法是

regexp <PATTERN> <INPUT> <WHOLE_MATCH_VAR> <CAPTURE_1_VAR> ... <CAPTURE_n_VAR> 

所以,你的情况,你有没有兴趣在全场比赛,只是把_在整场比赛预计:

set direction(1) {<RouteLabel>Hurdman</RouteLabel>} 
regexp {^.*>(.*)<} $direction(1) _ number 
puts $number 

印刷Hurdman。请参阅online Tcl demo

1

速成班TDOM这个确切的任务:

获取TDOM(注意包的名字拼写不同):

% package require tdom 
0.8.3 

创建一个空的文件有根元素叫foobar

% set doc [dom createDocument foobar] 
domDoc02569130 

修复根目录:

% set root [$doc documentElement] 
domNode025692E0 

设置你的XML字符串之一:

% set direction(1) {<RouteLabel>Hurdman</RouteLabel>} 
<RouteLabel>Hurdman</RouteLabel> 

将它添加到DOM树的根:

% $root appendXML $direction(1) 
domNode025692E0 

得到你想要的XPath表达式的字符串:

% $root selectNodes {string(//RouteLabel/text())} 
Hurdman 

或者通过查询根目录(只有在一次只插入一个文本节点的情况下才有效,否则将它们全部并置):

% $root asText 
Hurdman 

如果想从根本上清除DOM树,以使其准备追加新的字符串不旧的干扰:

% foreach node [$root childNodes] {$node delete} 

但是如果你使用XPath表达式,你应该能够附加任意数量的XML字符串并仍然检索其内容。

再次:

package require tdom 
set doc [dom createDocument foobar] 
set root [$doc documentElement] 
set direction(1) {<RouteLabel>Hurdman</RouteLabel>} 
$root appendXML $direction(1) 
$root selectNodes {string(//RouteLabel/text())} 
# => Hurdman 

文档: tdom (package)

+0

谢谢!很有帮助! –