使用tcl匹配任何重复模式

时间:2014-08-15 07:16:49

标签: regex tcl match

我有一个二进制文件,我不知道里面是什么。然后,我使用binary scan $bin_data "H*" hex_data将其转换为十六进制数。问题是如何匹配任何重复模式(字节)。

示例1:

在文件中:0cabab79
预期输出:abab

示例2:

在文件中:0c1f1f03035d
预期输出:1f1f0303

示例3:

在文件中:0c678967895d13
预期输出:67896789

2 个答案:

答案 0 :(得分:1)

您可以使用更灵活的正则表达式来获取所有重复的模式(至少2个字符):

set inputs [list 0cabab79 0c1f1f03035d 0c678967895d13]
foreach input $inputs {
    set out ""
    foreach {whole sub} [regexp -all -inline {(..+)\1} $input] {
      append out $whole
    }
    puts $out
}
# Output:
# abab
# 1f1f0303
# 67896789

如果你想确保模式是偶数个字符对(即aaaaaa应该给aaaa而不是aaaaaa),那么......

set inputs [list 0cabab79 0c1f1f03035d 0c678967895d13 aaaaaa]
foreach input $inputs {
    set out ""
    foreach {whole sub} [regexp -all -inline {((?:..)+)\1} $input] {
      append out $whole
    }
    puts $out
}
# Output:
# abab
# 1f1f0303
# 67896789
# aaaa

答案 1 :(得分:0)

您可以使用反向引用使用正则表达式执行此操作:

regexp -all -inline {(..)\1} 0c1f1f03035d

这将返回一个包含全长重复的列表,后面跟着所有匹配的重复元素 所以对于这个你会得到

1f1f 1f 0303 03

循环使用这些可以构建预期输出,例如

set op {}; 
foreach {rep sing} [regexp -all -inline {(..)\1} 0c1f1f03035d] {
  append op $rep
}