包含至少一个字母的 16 十六进制字符字符串的正则表达式
Posted
技术标签:
【中文标题】包含至少一个字母的 16 十六进制字符字符串的正则表达式【英文标题】:Regex for 16 hex char string that contains at least one letter 【发布时间】:2022-01-02 20:21:45 【问题描述】:我想写一个正则表达式来识别一个长度为16字节的十六进制字符串,例如:
1a2b3c4d1a2b3c4d
以下答案不正确正确:
[0-9a-fA-F]16
因为 16 位字符串(例如,1234567812345678
)也满足此正则表达式。必须排除 16 字节十六进制字符串没有十六进制字母(a-f
和A-F
)字符的情况。
我发现 Go 正则表达式不支持 positive/negtive lookahead,这应该很容易解决问题。
如何在 Go 中编写这样的正则表达式?
【问题讨论】:
"1234567812345678" 是一个十六进制字符串。如果要测试长度为 16 的字符串 s,请使用 len(s)==16,如果要测试字符串是否包含任何 abcdef,请使用 strings.ContainsAny(s, "abcdef")。另外:该语言称为“Go”。如果您的语言不是正则,则正则表达式将无济于事。 你为什么认为1234567812345678
是错的?
你能添加一些你想要的有效匹配和一些无效匹配吗?
您所描述的是 not 十六进制字符串(因为您的无效大小写是有效的十六进制字符串),因此您需要提供有关“是”或“不是”的更多详细信息t 对您的情况有效。你需要交替的数字和字母吗?任何至少有一个数字和一个字母的组合?您在这里有什么具体要求?
【参考方案1】:
您要匹配包含 16 个十六进制字符的字符串,其中一个十六进制字符必须是字母。
由于 Go 中使用的 RE2 正则表达式风格不支持环视,唯一的方法是列出(说明)所有可能的变体:
(?i)(?:[A-F][\dA-F]15|[\dA-F][A-F][\dA-F]14|[\dA-F]2[A-F][\dA-F]13|[\dA-F]3[A-F][\dA-F]12|[\dA-F]4[A-F][\dA-F]11|[\dA-F]5[A-F][\dA-F]10|[\dA-F]6[A-F][\dA-F]9|[\dA-F]7[A-F][\dA-F]8|[\dA-F]8[A-F][\dA-F]7|[\dA-F]9[A-F][\dA-F]6|[\dA-F]10[A-F][\dA-F]5|[\dA-F]11[A-F][\dA-F]4|[\dA-F]12[A-F][\dA-F]3|[\dA-F]13[A-F][\dA-F]2|[\dA-F]14[A-F][\dA-F]|[\dA-F]15[A-F])
在开头添加^
并在末尾添加$
以匹配与此模式匹配的整个字符串,或\b
单词边界,如果您需要在较长的文本中匹配整个单词。
所以,这是一个完整的字符串匹配模式:
(?i)^(?:[A-F][\dA-F]15|[\dA-F][A-F][\dA-F]14|[\dA-F]2[A-F][\dA-F]13|[\dA-F]3[A-F][\dA-F]12|[\dA-F]4[A-F][\dA-F]11|[\dA-F]5[A-F][\dA-F]10|[\dA-F]6[A-F][\dA-F]9|[\dA-F]7[A-F][\dA-F]8|[\dA-F]8[A-F][\dA-F]7|[\dA-F]9[A-F][\dA-F]6|[\dA-F]10[A-F][\dA-F]5|[\dA-F]11[A-F][\dA-F]4|[\dA-F]12[A-F][\dA-F]3|[\dA-F]13[A-F][\dA-F]2|[\dA-F]14[A-F][\dA-F]|[\dA-F]15[A-F])$
这是一个全词匹配模式:
(?i)\b(?:[A-F][\dA-F]15|[\dA-F][A-F][\dA-F]14|[\dA-F]2[A-F][\dA-F]13|[\dA-F]3[A-F][\dA-F]12|[\dA-F]4[A-F][\dA-F]11|[\dA-F]5[A-F][\dA-F]10|[\dA-F]6[A-F][\dA-F]9|[\dA-F]7[A-F][\dA-F]8|[\dA-F]8[A-F][\dA-F]7|[\dA-F]9[A-F][\dA-F]6|[\dA-F]10[A-F][\dA-F]5|[\dA-F]11[A-F][\dA-F]4|[\dA-F]12[A-F][\dA-F]3|[\dA-F]13[A-F][\dA-F]2|[\dA-F]14[A-F][\dA-F]|[\dA-F]15[A-F])\b
这里有一个方便的 javascript sn-p 会生成这个模式:
function generate()
var character_count = document.getElementById('char_count').value;
var obligatory_pattern = document.getElementById('obligatory_pattern').value;
var char_pattern = document.getElementById('char_pattern').value;
var pattern = '';
for (var i=0; i<character_count; i++)
pattern += `$char_pattern$i$obligatory_pattern$char_pattern$character_count-i-1|`;
var res = `(?:$pattern.replaceAll('1', '').replaceAll(`$char_pattern0`,'').replace(/\|$/,''))`;
document.getElementById('result').textContent = res.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="one" width=80%"" align="center">
<table>
<tr><td>Character count:</td><td><input type="text" id="char_count" value="16" /></td></tr>
<tr><td>Obligatory pattern:</td><td><input type="text" id="obligatory_pattern" value="[A-F]" /></td></tr>
<tr><td>Character pattern:</td><td><input type="text" id="char_pattern" value="[\dA-F]" /></td></tr>
<tr><td colspan="2"><button onclick="generate()">Generate</button></td></tr>
</table>
</div><br/>
<pre><b><code id="result"/></b></pre>
您需要将它与(?i)
不区分大小写的内联修饰符一起使用,或者将a-f
包含到范围中。
请参阅regex demo。
【讨论】:
以上是关于包含至少一个字母的 16 十六进制字符字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
用户名为4-16个字符(可包含中文,数字,字母和下划线)js正则表达式
需要一个包含至少一个数字、零个或多个字母、没有空格、最小/最大的正则表达式
包含至少 8 个字符和至少 1 个非字母数字字符的密码的正则表达式