用于匹配文件中的十六进制数字的 Java 正则表达式

发布于 2024-08-31 06:11:30 字数 653 浏览 2 评论 0原文

所以我正在读取一个文件(如 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...

所以我已经将所有错误追溯到解析输入和内容,所以我想我只是想找出需要什么正则表达式或方法才能使其按我想要的方式工作。

So I'm reading in a file (like java program < trace.dat) which looks something like this:

58
68
58
68
40
c
40
48
FA

If I'm lucky but more often it has several whitespace characters before and after each line.

These are hexadecimal addresses that I'm parsing and I basically need to make sure that I can get the line using a scanner, buffered reader... whatever and make sure I can then convert the hexadecimal to an integer. This is what I have so far:

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...

So I've traced all my errors to parsing input and stuff so I guess I'm just trying to figure out what regex or approach I need to get this working the way I want.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

飘然心甜 2024-09-07 06:11:30

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)

The s.next() takes care of the white-spaces. (The default tokenizer doesn't care about them.)

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));
    }
}

If you'd really like to stick with the Pattern-approach, I would recommend you to use the XDigit class:

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

Further more; The scanner.next(pattern) will return the entire matched pattern (including the white-spaces!) You need to work with capturing groups. Try the pattern

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

And then get the actual hex-number with matcher.group(1)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文