解析字符串中的HEX值

时间:2014-09-22 09:40:46

标签: regex tcl

我正在尝试从具有此条件的字符串中获取十六进制值" VALUE:num,num,num,HEX,num,num"

我有以下

% set STRINGTOPARSE "VALUE: 12,12,13,2,9,5271256369606C00,0,0" 
% regexp {(,[0-9A-Z]+,)+} $STRINGTOPARSE result1 result2 result3
1
% puts $result1
,12,
% puts $result2
,12,
% puts $result3

我相信{(,[0-9A-Z] +,)+}的条件足以从上面的字符串中取出HEX, 但相反,我得到了第一个结果",12,"而不是我想要的HEX。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可能希望使用拆分:

set result [lindex [split $STRINGTOPARSE ","] 5]

regexp没有向您提供您要查找的结果,因为匹配的第一部分是,12,,匹配就在那里停止,并且不会寻找更多匹配。

您可以使用regexp来执行此操作,但会更麻烦......一种可能的方法是匹配每个逗号:

regexp {^(?:[^,]*,){5}([0-9A-F]+),} $STRINGTOPARSE -> hex

(?:[^,]*,){5}匹配前五个非逗号部分及其逗号,([0-9A-F]+)然后抓取您正在寻找的十六进制值。


我认为问题在于您似乎认为[0-9A-Z]必须至少匹配一个字母,而事实并非如此。它将匹配角色类中的任何角色,只要你得到1个匹配的角色就可以获得匹配。

如果你想要一个正则表达式来匹配一系列带有数字和字母的字符,那么你将不得不使用一些前瞻(单独使用类可能会使它更混乱):

regexp {\y(?=[^,A-Z]*[0-9])(?=[^,0-9]*[A-Z])[0-9A-Z]+\y} $STRINGTOPARSE -> hex

但是......这看起来可能比以前更加复杂,所以我建议坚持分裂:)