我正在尝试从具有此条件的字符串中获取十六进制值" 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。我做错了什么?
答案 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
但是......这看起来可能比以前更加复杂,所以我建议坚持分裂:)