【问题标题】:Approaches for reversing sprintf/format反转 sprintf/format 的方法
【发布时间】:2011-06-25 09:53:38
【问题描述】:

我必须通过分析格式化结果来启发式地确定格式模式字符串。

例如我有这些字符串:

您有 3 条未读消息。

您有 10 条未读消息。

对不起,戴夫。恐怕我做不到。

对不起,弗兰克。恐怕我做不到。

这个说法是错误的。

我想导出这些格式字符串:

您有 %s 条未读消息

对不起,%s。恐怕我做不到。

这个说法是错误的。

哪些方法和/或算法可以帮助我?

我的第一个想法是使用机器学习的东西,但我的直觉告诉我这可能是一个相当经典的问题。

一些额外的要求:

  • 参数的类型无关紧要,即如果参数最初是 %s%d 或者它是否被填充或对齐,我不需要该信息。
  • 可以有多个参数(或根本没有)
  • 通常数据由数千个格式化字符串组成,但只有几十个格式模式。

【问题讨论】:

  • +1,很棒的问题。顺便说一句,您的意思是“您有 %d 条未读消息”吗?
  • @templatetypedef:是和不是。如果我能确定原始类型,那就太好了,但这不是必需的。但是如果可以找到参数的大致位置,那么确定实际类型应该不难。 (虽然这并不总是正确的,例如 Javas String.format 允许 int 填写 %s
  • @DR- 啊,所以您正试图找到更改的位置。我以为你已经知道了它们在哪里,需要弄清楚需要什么可怕的 %s、%d、%-s、%8d 等组合。不过还是很有趣。
  • 你知道有多少个格式字符串吗?他们可以有多个参数吗? (确实很有趣的问题,+1。)

标签: algorithm string language-agnostic pattern-matching format-string


【解决方案1】:
  1. 通过某种相似性度量对字符串进行聚类(我会尝试最长公共子序列的长度,LCS)。 Determining the number of clusters 是最难的部分,如果你事先不知道的话。

  2. 在每个簇中,确定其中所有字符串的 LCS,记录出现的间隙位置。用%s 替换间隙。 (您可能想要构建一个函数,返回基于 LCS 的格式字符串和 fold/reduce 在集群上。)

上面是一个贪心算法,给定 {foobar, fooBaR} 产生foo%sa%s。您可能希望用单个 %s 递归替换由单个字符(或单个非空白字符等)分隔的任何一对 %s

【讨论】:

  • 我一直在尝试一点,看来找到簇的数量不仅是最难的部分,而且是必不可少的,因为簇的数量是格式字符串的数量(最好案例)
  • 好的,我正在尝试使用 Hochbaum Shmoys 启发式来解决类似于 k 中心问题 的问题。一旦 LCS 的长度达到某个阈值,我就会停止选择新的中心。
猜你喜欢
  • 2017-11-15
  • 2020-11-14
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多