Regex, чтобы найти целое или десятичное из строки в Java в одной группе?

Я стараюсь (\d+|\d+\.\d+) в этом примере строки:

Oats     124   0.99        V    1.65

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

Я хочу свои ответы в одной группе.

3 ответа

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

(\d+(?:\.\d+)?)

Используйте вышеприведенный шаблон и получите числа из индекса группы 1.

DEMO

Код:

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+)

DEMO

Попробуйте этот шаблон:

\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+)
Другие вопросы по тегам