【问题标题】:How to build a regular expression matching hexadecimal digits?如何构建匹配十六进制数字的正则表达式?
【发布时间】:2014-08-11 08:23:20
【问题描述】:

我正在尝试为字节序列创建一个正则表达式。序列是来自用户的输入字符串,例如:

00 a5 88

正则表达式应该检查输入是否是正确的字节序列。因此,例如,这应该是不可能的:

00 0 66

但这两个应该:

a b
a 05 b

到目前为止,我有这个正则表达式:

(^[a-fA-F\\d]{1,2})((\\s[a-fA-F\\d]{2})*)

问题到此为止。

这适用于 0145 452 但不适用于 45 44 54 00 55 4

我试过了:(^[a-fA-F\\d]{1,2})((\\s[a-fA-F\\d]{2})*)([a-fA-F\\d]{1,2}$)

但不是我想的那样。

我的输入应该是十六进制字节,因为之后我在一个看起来像这样的转储字符串中搜索这个输入:

这对我来说非常适合:

BYTE_REGEX = "(^(\\p{XDigit}{1,2}))(\\s\\p{XDigit}{2})*(\\s\\p{XDigit})?";

【问题讨论】:

  • “正确”是什么意思?为什么“00 0 66”无效而“00 a5 88”有效?
  • 你试过解析十六进制吗?如果它失败或超出范围,它不是一个正确的序列......或者这是一个正则表达式的赋值:)
  • \p{XDigit}{1,2}( \p{XDigit}{2})*( \p{XDigit})?怎么样

标签: java regex hex hexdump


【解决方案1】:

这是 128 字节的正则表达式,以十六进制表示:

^([0-9|a-f|A-F][0-9|a-f|A-F]){1,64}$

如果您想要 X 字节,只需将 X/2 值放在正则表达式中:

^([0-9|a-f|A-F][0-9|a-f|A-F]){1,X/2}$

【讨论】:

  • 这将匹配||||||||
  • 不,它没有,你的正则表达式不匹配空格,它匹配管道字符,所以,这是错误的。
  • 请测试一下 ;) final String a = "This is the corect answer"; final StringBuilder sb = new StringBuilder(a.getBytes().length * 2); for (final byte b : a.getBytes()) { sb.append(String.format("%02x", b & 0xff)); } System.out.println(sb.toString()); final Pattern reg = Pattern.compile("^([0-9|a-f|A-F][0-9|a-f|A-F]){1,100}$"); System.out.println(reg.matcher(sb.toString()).find());
  • 你读过这个问题吗? OP想要匹配00 a5 88之类的东西,你的正则表达式不匹配这个。
  • 您在哪里看到正则表达式必须匹配真正的十六进制转储?很抱歉,您的正则表达式在字符类中匹配 ||||| 确实是一个管道字符。
【解决方案2】:

我认为你应该使用:

BYTE_REGEX = "(^\s*(\p{XDigit}{1,2}))(\s+\p{XDigit}{2})*(\s+\p{XDigit})?";

这是您自己的轻微变化,允许:

  • 字符串开头的空格(不确定是否有用)
  • 多个空格作为分隔符

因为转储通常按 4 或 8 分组显示每行 16 个字节,组之间的间隔更大。

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2014-03-05
    • 1970-01-01
    • 2016-12-30
    • 2019-02-28
    • 2019-04-25
    相关资源
    最近更新 更多