Regex, чтобы найти целое или десятичное из строки в Java в одной группе?
Я стараюсь (\d+|\d+\.\d+)
в этом примере строки:
Oats 124 0.99 V 1.65
но это дает мне десятичное число в разных группах, когда я использую классы сопоставления с образцом в Java.
Я хочу свои ответы в одной группе.
3 ответа
Вам не нужно иметь отдельные шаблоны для целых чисел и чисел с плавающей точкой. Просто сделайте десятичную часть необязательной, и вы можете получить оба типа чисел из одной группы.
(\d+(?:\.\d+)?)
Используйте вышеприведенный шаблон и получите числа из индекса группы 1.
Код:
String s = "Oats 124 0.99 V 1.65";
Pattern regex = Pattern.compile("(\\d+(?:\\.\\d+)?)");
Matcher matcher = regex.matcher(s);
while(matcher.find()){
System.out.println(matcher.group(1));
}
Выход:
124
0.99
1.65
Объяснение картины:
()
группа захвата.\d+
соответствует одной или нескольким цифрам.(?:)
Неконтролирующая группа.(?:\.\d+)?
Соответствует точке и следующим одной или нескольким цифрам.?
после того, как группа без захвата делает всю группу без захвата необязательной.
ИЛИ ЖЕ
Ваше регулярное выражение также будет работать, только если вы измените порядок паттернов.
(\d+\.\d+|\d+)
Попробуйте этот шаблон:
\d+(?:\.\d+)?
Edit:
\d+ match 1 or more digit
(?: non capturing group (optional)
\. '.' character
\d+ 1 or more digit
)? Close non capturing group
Вопрос не совсем понятен, но первая проблема, которую я вижу, это. магический символ в регулярном выражении, означающий любой символ. Вы должны избежать этого как. Существует множество чит-листов Regex, например, JavaScript Regex Cheatsheet.
(\d+|\d+\.\d+)