大家好我想要这个正则表达式的解决方案,我的问题是提取H'xxxx
形式的所有十六进制数字,我使用这个正则表达式但我没有得到所有的十六进制只有我得到一个数字,如何从此字符串中获取整数十六进制数
set hex "V5CCH,IA=H'22EF&H'2354&H'4BD4&H'4C4B&H'4D52&H'4DC9"
set res [regexp -all {H'([0-9A-Z]+)&} $hex match hexValues]
puts "$res H$hexValues"
我得到的输出是5 H4D52
答案 0 :(得分:25)
-all -inline
-all
:使正则表达式在字符串中尽可能多地匹配,返回找到的匹配总数。如果使用匹配变量指定了它,它们将仅包含最后一个匹配的信息。
-inline
:使命令以列表形式返回否则将放在匹配变量中的数据。使用-inline
时,可能未指定匹配变量。如果与-all
一起使用,则列表将在每次迭代时连接,以便始终返回平面列表。对于每个匹配迭代,该命令将追加整体匹配数据,并在正则表达式中为每个子表达式添加一个元素。
因此,要返回所有匹配项(包括组的捕获) - 作为Tcl中的平面列表,您可以写:
set matchTuples [regexp -all -inline $pattern $text]
如果模式具有组0…N-1
,则每个匹配都是列表中的N
- 元组。因此,实际匹配的数量是此列表的长度除以N
。然后,您可以使用foreach
和N
变量来迭代列表中的每个元组。
例如N = 2
,您有:
set numMatches [expr {[llength $matchTuples] / 2}]
foreach {group0 group1} $matchTuples {
...
}
这是针对此特定问题的解决方案,使用输出注释为注释(see also on ideone.com):
set text "V5CCH,IA=H'22EF&H'2354&H'4BD4&H'4C4B&H'4D52&H'4DC9"
set pattern {H'([0-9A-F]{4})}
set matchTuples [regexp -all -inline $pattern $text]
puts $matchTuples
# H'22EF 22EF H'2354 2354 H'4BD4 4BD4 H'4C4B 4C4B H'4D52 4D52 H'4DC9 4DC9
# \_________/ \_________/ \_________/ \_________/ \_________/ \_________/
# 1st match 2nd match 3rd match 4th match 5th match 6th match
puts [llength $matchTuples]
# 12
set numMatches [expr {[llength $matchTuples] / 2}]
puts $numMatches
# 6
foreach {whole hex} $matchTuples {
puts $hex
}
# 22EF
# 2354
# 4BD4
# 4C4B
# 4D52
# 4DC9
请注意,我稍微更改了模式:
[0-9A-Z]+
,例如[0-9A-F]{4}
更具体地用于匹配4个十六进制数字&
,则输入中的最后一个十六进制字符串(H'4DC9
)无法匹配
4D52
,因为这是与&
的最后一次匹配&
,或者改为使用(&|$)
,即&
或字符串$
的结尾。答案 1 :(得分:2)
我不是Tclish,但我认为您需要同时使用-inline
和-all
选项:
regexp -all -inline {H'([0-9A-Z]+)&} $string
编辑:这次又是,这一次是正确的正则表达式(见评论):
regexp -all -inline {H'[0-9A-F]+&} $string