【问题标题】:check hex string contains only hex bounded values检查十六进制字符串仅包含十六进制有界值
【发布时间】:2014-03-26 08:48:45
【问题描述】:

如何检查给定的十六进制字符串仅包含十六进制数字。是否有任何简单的方法或任何相同的java库?我有像“01AF”这样的字符串,我必须检查字符串是否只包含十六进制范围值,因为我现在正在做的是获取字符串然后拆分字符串和然后将其转换为适当的格式,然后检查该值。有什么简单的方法吗?

【问题讨论】:

  • 您能否提供输入和预期结果的示例?是否有字符串长度等限制?我怀疑matches(regex) 可以提供帮助。
  • 你应该看看 String.matches 的正则表达式检查间隔 0-9A-F。这篇文章可以帮到你:vogella.com/tutorials/JavaRegularExpressions/article.html
  • @Pshemo "O1AG"...这将显示错误,因为字符串中出现了“G”。

标签: java string hex


【解决方案1】:
try
{
    String hex = "AAA"
    int value = Integer.parseInt(hex, 16);  
    System.out.println("valid hex);
 }
 catch(NumberFormatException nfe)
 {
    // not a valid hex
    System.out.println("not a valid hex);
 }

如果十六进制字符串无效,这将抛出 NumberFormatException。

参考文档here

【讨论】:

    【解决方案2】:

    如果您想检查字符串是否仅包含 0-9、a-h 或 A-H,您可以尝试使用

    yourString.matches("[0-9a-fA-F]+");
    

    要优化它,您可以提前创建Pattern

    Pattern p = Pattern.compile("[0-9a-fA-F]+");
    

    然后将其重用为

    Matcher m = p.matcher(yourData);
    if (m.matches())
    

    甚至用

    重用Matcher 实例
    m.reset(newString);
    if (m.matches())
    

    【讨论】:

    • 十六进制数字只上升到 F,而不是 H :)
    • @Julien Woops,g 键的错误边 :) 谢谢,已更新。
    【解决方案3】:

    String str 作为您的输入字符串:

    选项#1:

    public static boolean isHex(String str)
    {
        try
        {
            int val = Integer.parseInt(str,16);
        }
        catch (Exception e)
        {
            return false;
        }
        return true;
    }
    

    选项 #2:

    private static boolean[] hash = new boolean[Character.MAX_VALUE];
    static // Runs once
    {
        for (int i=0; i<hash.length; i++)
            hash[i] = false;
        for (char c : "0123456789ABCDEFabcdef".toCharArray())
            hash[c] = true;
    }
    public static boolean isHex(String str)
    {
        for (char c : str.toCharArray())
            if (!hash[c])
                return false;
        return true;
    }
    

    【讨论】:

    • 选项 #2 真的很难看。
    • @Julien:选项#3 怎么样?
    • 嗯,我建议将选项 #2 替换为 String.matches("[1-9a-fA-F]+") 之类的东西(我不太确定正则表达式的语法,但是应该不远)。
    • 选项 #2 和 #3 很糟糕,因为实际上是 for 循环 :) 它为代码复杂性增加了 +1,并且比任何使用正则表达式的方法都慢。
    • @Julien,我用稍微“漂亮”的实现替换了它们。但是,请注意,在所有情况(包括我的第一个选项,以及您的“正则表达式”建议)中,复杂性取决于输入字符串的长度。在我之前的选项 2 和 3 中,如果输入字符串短于 22 个字符(所有可能的十六进制数字),复杂性会稍高。但是差别很小,而且总的来说,这个问题看起来不像是复杂性相关的问题。
    【解决方案4】:

    如果有人在解析 Mongodb ObjectId 时尝试避免以下异常到达此线程:

    java.lang.IllegalArgumentException: invalid hexadecimal representation of an ObjectId: [anInvalidId]
    

    然后注意 mongo-java-driver 库提供的this utility method

    ObjectId.isValid(stringId)
    

    相关话题:

    How to determine if a string can be used as a MongoDB ObjectID?

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 2019-12-26
      • 2018-01-22
      • 2014-10-07
      • 2019-07-27
      • 1970-01-01
      • 2011-07-16
      • 2010-10-04
      相关资源
      最近更新 更多