Java Regex для сопоставления шестнадцатеричных чисел в файле - PullRequest
2 голосов
/ 03 мая 2010

Итак, я читаю в файле (например, в 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...

Итак, я отследил все свои ошибки до парсинга ввода и прочее, поэтому, я думаю, я просто пытаюсь выяснить, какое регулярное выражение или подход мне нужно, чтобы это работало так, как я хочу.

1 Ответ

4 голосов
/ 03 мая 2010

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

Если вы действительно хотите придерживаться Pattern-подхода, я бы порекомендовал вам использовать класс XDigit:

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

Дальше больше; scanner.next(pattern) вернет весь соответствующий шаблон (включая пробелы!). Вам нужно работать с группами захвата. Попробуйте шаблон

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

И затем получить фактическое шестнадцатеричное число с помощью matcher.group (1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...