Выражение регулярного выражения для 8 цифр перед десятичной дробью и 2 после десятичной и целой строки не должно вычисляться в ноль - PullRequest
1 голос
/ 06 января 2020

Мне нужно выражение регулярного выражения для следующего:

  • 8 цифр до десятичной дроби
  • 2 цифры после десятичной дроби

\d{0,8}(\.\d{1,2})?$

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

  • 0000.00 -> false
  • 00.00 -> false
  • 0.0 -> false

Ответы [ 3 ]

2 голосов
/ 06 января 2020

Другим вариантом является утверждение не только точек и нулей

^(?![0.]*$)\d{0,8}(?:\.\d{1,2})?$

Regex demo | Java демо

В Java

String regex = "^(?![0.]*$)\\d{0,8}(?:\\.\\d{1,2})?$";

Если вы хотите только совпадение, вы можете опустить группу захвата и сделать ее не захватывающей (?:

1 голос
/ 06 января 2020
"(?=[1-9])(\\d{0,8}(\\.\\d{1,2})?)"

Подойдет прогноз с ненулевым ди git.

0 голосов
/ 06 января 2020

Поскольку это java, и вы используете регулярное выражение для проверки шаблона

^\d{0,8}(\.\d{1,2})?$

получит число с двумя необязательными десятичными знаками.

Получив это число, вы можете разобрать его в двойное число и проверить, что оно не равно 0.

String test = "100.00";
if (Pattern.compile("^\\d{0,8}(\\.\\d{1,2})?$").matcher(test).matches()) {
    double val = Double.parseDouble(test);
    if (val > 0) {
        // do something
    }
}

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

final double maxVal = 99999999.99;
String test = "100.00";
try {
    double val = Double.parseDouble(test);
    if (val > 0 && val <= maxVal) {
        int decimalIndex = test.indexOf(".");
        if (decimalIndex >= 0) {
            if (test.length() - decimalIndex - 1 <= 2) {
                // do something, at most two deximals
            }
        } else {
            // do something, no decinals
        }
    }
} catch (NumberFormatException e) {
    // todo handle exception
}
...