Что такое регулярное выражение для десятичных чисел в Java?

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

String regex = "[0-9]*[.]?[0-9]*";
String regex = "[0-9]*['.']?[0-9]*";
String regex = "[0-9]*["."]?[0-9]*";
String regex = "[0-9]*[\.]?[0-9]*";
String regex = "[0-9]*[\\.]?[0-9]*";
String regex = "[0-9]*.?[0-9]*";
String regex = "[0-9]*\.?[0-9]*";
String regex = "[0-9]*\\.?[0-9]*";

Но то, что я хочу, это фактическое "." сам персонаж. У кого-нибудь есть идея?

На самом деле я пытаюсь написать регулярное выражение для неотрицательного действительного числа (разрешены десятичные дроби). Таким образом, возможности: 12.2, 3.7, 2., 0.3, .89, 19

String regex = "[0-9]*['.']?[0-9]*";
Pattern pattern = Pattern.compile(regex);

String x = "5p4";
Matcher matcher = pattern.matcher(x);
System.out.println(matcher.find());

Последняя строка должна печатать false, но в любом случае печатает true. Я думаю, что мое регулярное выражение неправильно, хотя.

5 ответов

Обновить

Чтобы сопоставить неотрицательное десятичное число, вам нужно это регулярное выражение:

^\d*\.\d+|\d+\.\d*$

или в синтаксисе Java: "^\\d*\\.\\d+|\\d+\\.\\d*$"

String regex = "^\\d*\\.\\d+|\\d+\\.\\d*$"
String string = "123.43253";

if(string.matches(regex))
    System.out.println("true");
else
    System.out.println("false");

Объяснение ваших первоначальных попыток регулярных выражений:

[0-9]*\.?[0-9]*

с выходом Java становится:

"[0-9]*\\.?[0-9]*";

если вам нужно сделать точку обязательной, вы удалите? отметка:

[0-9]*\.[0-9]*  

но при этом будет принята только точка без числа... Итак, если вы хотите, чтобы валидация считала число обязательным, вы используете + (что означает один или более) вместо *(что означает ноль или более). В этом случае это становится:

[0-9]+\.[0-9]+

Если вы на Kotlin, используйте ktx:

fun String.findDecimalDigits() =
    Pattern.compile("^[0-9]*\\.?[0-9]*").matcher(this).run { if (find()) group() else "" }!!

Ваше первоначальное понимание, вероятно, было правильным, но вы были брошены, потому что при использовании matcher.find(), ваше регулярное выражение найдет первое допустимое совпадение в строке, и все ваши примеры будут соответствовать строке нулевой длины.

Я бы предложил "^([0-9]+\\.?[0-9]*|[0-9]*\\.[0-9]+)$"

На самом деле есть 2 способа, чтобы соответствовать буквальному ., Один использует обратную косую черту, как вы делаете там \\.и другой способ заключается в том, чтобы заключить его в класс символов или в квадратные скобки, такие как [.], Большинство специальных символов становятся буквальными символами в квадратных скобках, включая ., Так что используйте \\. показывает ваше намерение яснее, чем [.] если все, что вы хотите, это соответствовать буквальной точке ., использование [] если вам нужно сопоставить несколько вещей, которые представляют совпадают с тем или иным, например, это регулярное выражение [\\d.] означает совпадение с одной цифрой или буквальной точкой

Я проверил все случаи.

      public static boolean isDecimal(String input) {
        return Pattern.matches("^[-+]?\\d*[.]?\\d+|^[-+]?\\d+[.]?\\d*", input);
}
Другие вопросы по тегам