Как сделать регулярное выражение для единиц измерения? - PullRequest
0 голосов
/ 19 января 2010

Я строю небольшую библиотеку Java, которая должна соответствовать единицам в строках. Например, если у меня «300000000 м / с ^ 2», я хочу, чтобы оно совпадало с «m» и «s ^ 2».

До сих пор я пробовал самые мыслимые (мной) конфигурации, похожие (надеюсь, это хорошее начало)

"[[a-zA-Z]+[\\^[\\-]?[0-9]+]?]+"

Чтобы уточнить, мне нужно что-то, что будет соответствовать letters[^[-]numbers] (где [] обозначает необязательные части). Это означает: буквы, возможно, сопровождаемые показателем степени, который возможно отрицателен.

Я немного изучил регулярные выражения, но я не очень хорошо говорю, поэтому любая помощь будет принята с благодарностью!

Большое спасибо,

EDIT: Я только что попробовал первые 3 ответа

String regex1 = "([a-zA-Z]+)(?:\\^(-?\\d+))?";
String regex2 = "[a-zA-Z]+(\\^-?[0-9]+)?";
String regex3 = "[a-zA-Z]+(?:\\^-?[0-9]+)?";

и это не работает ... Я знаю код, который проверяет работу шаблонов, потому что если я попробую что-то простое, например, сопоставив "[0-9] +" в "12345", это будет соответствовать всей строке , Итак, я не понимаю, что все еще не так. Я пытаюсь изменить мои скобки для скобок, где это необходимо в данный момент ...

КОД, ИСПОЛЬЗУЕМЫЙ ДЛЯ ИСПЫТАНИЯ:

public static void main(String[] args) {
    String input = "30000 m/s^2";

//    String input = "35345";

    String regex1 = "([a-zA-Z]+)(?:\\^(-?\\d+))?";
    String regex2 = "[a-zA-Z]+(\\^-?[0-9]+)?";
    String regex3 = "[a-zA-Z]+(?:\\^-?[0-9]+)?";
    String regex10 = "[0-9]+";
    String regex = "([a-zA-Z]+)(?:\\^\\-?[0-9]+)?";
    Pattern pattern = Pattern.compile(regex3);
    Matcher matcher = pattern.matcher(input);

    if (matcher.matches()) {
        System.out.println("MATCHES");
        do {
            int start = matcher.start();
            int end = matcher.end();
//            System.out.println(start + " " + end);
            System.out.println(input.substring(start, end));
        } while (matcher.find());
    }

}

Ответы [ 3 ]

2 голосов
/ 19 января 2010
([a-zA-Z]+)(?:\^(-?\d+))?

Вам не нужно использовать класс символов [ ... ], если вы соответствуете одному символу. ( ... ) вот захватная скобка для вас, чтобы извлечь единицу и экспоненту позже. (?: ... ) - группировка без захвата.

0 голосов
/ 19 января 2010

Попробуйте

"[a-zA-Z]+(?:\\^-?[0-9]+)?"
0 голосов
/ 19 января 2010

Вы смешиваете использование квадратных скобок для обозначения классов символов и фигурных скобок для группировки. Попробуйте вместо этого:

[a-zA-Z]+(\^-?[0-9]+)?

Во многих диалектах регулярных выражений вы можете использовать \ d для обозначения любой цифры вместо [0-9].

...