【问题标题】:Java Regex for matching hexadecimal numbers in a file用于匹配文件中的十六进制数字的 Java 正则表达式
【发布时间】:2011-02-14 22:54:17
【问题描述】:

所以我正在读取一个看起来像这样的文件(如 java 程序

58
68
58
68
40
c
40
48
FA

如果我很幸运,但更常见的是每行前后都有几个空白字符。

这些是我正在解析的十六进制地址,我基本上需要确保我可以使用扫描仪、缓冲阅读器获得该行......无论如何,并确保我可以将十六进制转换为整数。这是我目前所拥有的:

Scanner scanner = new Scanner(System.in);
int address;
String binary;
Pattern pattern = Pattern.compile("^\\s*[0-9A-Fa-f]*\\s*$", Pattern.CASE_INSENSITIVE);
while(scanner.hasNextLine()) {
    address = Integer.parseInt(scanner.next(pattern), 16);
    binary = Integer.toBinaryString(address);
    //Do lots of other stuff here
}
//DO MORE STUFF HERE...

所以我已经将我的所有错误都追溯到解析输入和内容,所以我想我只是想弄清楚我需要什么正则表达式或方法才能让它按照我想要的方式工作。

【问题讨论】:

    标签: java regex hex


    【解决方案1】:

    s.next() 负责处理空白。 (默认的分词器不关心它们。)

    import java.util.Scanner;
    public class Test {
        public static void main(String... args) {
            Scanner s = new Scanner(System.in);
            while (s.hasNext())
                System.out.println(Integer.parseInt(s.next(), 16));
        }
    }
    

    如果您真的想坚持模式方法,我建议您使用 XDigit 类:

    \p{XDigit} A hexadecimal digit: [0-9a-fA-F]
    

    更多; scanner.next(pattern) 将返回整个匹配的模式(包括空格!)您需要使用捕获组。试试这个模式

    ^\\s*(\\p{XDigit}+)\\s*$
    

    然后用matcher.group(1)得到实际的十六进制数

    【讨论】:

    • 这是我尝试此操作时得到的结果:线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:“”在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:48 ) 在 java.lang.Integer.parseInt(Integer.java:470) 在 Cache.access(Cache.java:82) 在 Cache.main(Cache.java:136)
    • 我正在尝试修复一个错误,抱歉,我在代码的其他地方不断收到 InputMismatchException。
    • 好的。请注意,我将[0-9A-Fa-f]* 更改为[0-9A-Fa-f]+。不要忘记 * 也匹配 0 个字符。即^\\s*[0-9A-Fa-f]*\\s*$匹配空行(其中\\s*[0-9A-Fa-f]*\\s*都对应空字符串。+的意思是“至少一个字符”,可能更接近你的意思想要。
    • 有了这个我得到一个 IllegalStateException
    • 确保你在上面描述的模式中将* 更改为+。如果问题仍然存在,请在您的问题中发布输入,或者更好的是,发布您获得异常的输入行。
    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2016-12-30
    • 2019-02-28
    相关资源
    最近更新 更多