Что такое регулярное выражение для десятичных чисел в 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);
}