java matcher regexp для чисел с плавающей запятой и операторов не так? - PullRequest
0 голосов
/ 08 марта 2011

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

    Matcher numbers = Pattern.compile("[0-9]*\\.?[0-9]+").matcher(expr);
    Matcher m = Pattern.compile("[\\+|\\*|/|\\-|\\^|\\!|_|([0-9]*\\.?[0-9]+)]").matcher(expr);

    while(numbers.find()) {
            System.out.print(" " + numbers.group() + " num \n"); 
    }

    while (m.find()) {
       System.out.print(" " + m.group() + " -- \n");
    }

heres output

3,0 номер 2 номер

3 -.- 0 - 2 -

, поскольку вы видите, что средство сравнения чисел просто находит числа с плавающей запятой и нормальные числа, и это прекрасно работает.но если я использую его во втором совпадении, разделенном на or, я получу 3.0 как отдельные совпадения.

Ответы [ 2 ]

1 голос
/ 08 марта 2011

IIRC В регулярных выражениях Java используются операторы группировки, а не квадратные скобки, как у вас.Вы пробовали

"(\\+|\\*|/|\\-|\\^|\\!|_|([0-9]*\\.?[0-9]+))"

вместо этого?Потому что у вас есть просто большой, многократно избыточный набор символов: он должен просто соответствовать любому из символов между первой левой квадратной скобкой и последней правой квадратной скобкой.Это похоже на поведение, которое вы видите.

Или я полностью не понял намерения второго регулярного выражения?

0 голосов
/ 08 марта 2011

Попробуйте это без [] вокруг всего этого.Они превращают его во вложенный символьный класс (что специфично для регулярных выражений Java), поэтому вы просто ищете отдельные символы в списке \|+*/-^!_(0123456789].?), когда все дубликаты удалены.

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