当前位置:  开发笔记 > 开发工具 > 正文

匹配SHA1的正则表达式

如何解决《匹配SHA1的正则表达式》经验,为你挑选了3个好方法。

我试图将通用文本中的SHA1与正则表达式匹配.

理想情况下,我想避免匹配单词.

可以肯定地说,完整的SHA1具有独特的模式(它们很长并且长度一致) - 所以我可以可靠地匹配它们 - 但是缩小的SHA1是什么?

我可以依赖数字的存在吗?

在我的提交日志中查看SHA1 - 数字始终显示在前3个字符中.但这太短了吗?在我可以假设一个数字出现之前,我需要考虑多少个SHA1字符?

这不一定是100%准确 - 我只需要在99%的时间内匹配缩写的SHA1.



1> Greg Hewgill..:

您可以认为SHA1哈希值是完全随机的,因此这会降低概率.给定数字不是数字的概率是6/16或0.375.三个SHA1数字都不是数字的概率是0.375**3或0.0527(5%ish).在六位数时,这再次降低到0.00278(0.2%).五位数,所有字母的概率都低于1%(你说你想要匹配99%的时间).

创建一个始终与SHA1值匹配的正则表达式很容易:

\b[0-9a-f]{5,40}\b

然而,这也可能匹配完美的五个字母单词,如"添加"或"褪色".在我的/usr/share/dict/words文件中,有几个六个字母单词匹配:"accede","beaded","bedded","decade","deface","efface"和"facade"是最有可能的.在七封信中,只有"深化",不太可能出现在散文中.这一切都取决于你可以容忍多少误报,以及你实际遇到的可能的词是什么.


为什么{5,40}而不是{40}?
@sheepsimulator:大概是因为缩写哈希是很常见的 - 尽管git输出中的默认缩写长度是7,所以你可以非常安全地转到`{7,40}`并且误报率更低.@Greg Hewgill:我的/ usr/share/dict词还包含"已加入","污损","抹去"和"有瑕疵" - 前三个是常见的,至少相对于深化!

2> jrockway..:

你究竟想做什么?您不需要使用启发式解析任何git输出 - 您始终可以准确地请求所需的数据.

如果要匹配SHA1总和的完整十六进制表示,请尝试:

/\b([a-f0-9]{40})\b/

也就是说,由40个字符组成的单词,可以是数字,也可以是字母a到f.

如果你只有几个角色并且不知道它们在哪里,那么你几乎没有运气."e78fd98"是缩写的提交ID吗?也许,但是"1234567"怎么样?这是一个提交ID吗?问题票号?一个使测试失败的数字?

没有上下文,您无法真正了解数据的含义.

要回答你的直接问题,SHA1的属性不会产生前三个字符(十六进制形式)的数字.根据你的看法,你很幸运,或者也许是不幸的.


这就是你想要的,正好40个字符的十六进制数字总是匹配,而不是当前接受的答案,可能总是不起作用.

3> bendin..:

我假设您要匹配SHA1的十六进制打印表示形式,而不是等效的20个原始字节。此外,我将假设所讨论的SHA1仅使用小写字母表示十六进制数字。如果您的要求有所不同,则必须调整正则表达式。

grep -o -E -e "[0-9a-f]{40}"

将匹配这样的SHA1。您需要将上述正则表达式从egrep的方言转换为您恰巧使用的任何工具。由于匹配必须正好是40个字符长,因此我认为您不存在意外匹配单词的危险。我不知道任何仅由字母a到f组成的40个字符的单词。

编辑:

更好的是:使用Regex匹配SHA1,因为他的解决方案包括检查两端的单词边界。我在上面忽略了这一点。

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有