Регулярные выражения в Java, одно и то же регулярное выражение несколько раз подряд - PullRequest
1 голос
/ 31 августа 2010

Я хочу проанализировать строку из 12 (часто) различных чисел с плавающей точкой (с некоторым не относящимся к делу текстом впереди, отмечая поле), и хочу, чтобы все они оказались в собственной группе захвата, чтобысобирать их из matcher по одному.Я заметил, что я преуспел, написав следующее:

Pattern lastYearIncomePattern = Pattern.compile("(.+\\{\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)");

, что является изнурительной массой дублированного кода.Партия ([0-9]{1,2}\\.[0-9]{3}\\s) произойдет 12 раз.

Есть ли способ сделать это лучше?Я посмотрел, как определить эту строку для себя, а затем добавить ее в регулярное выражение с помощью некоторого цикла и StringBuilder, но все это кажется слишком преувеличенным.Очевидно, что обратная ссылка тоже не работала, поскольку 12 значений разные.

Мой первый подход был написать ([0-9]{1,2}\\.[0-9]{3}\\s){12}, но это поместит все 12 чисел в одну длинную строку, и это не то, что я хочу,так как мне понадобится еще один паттерн, чтобы потом собрать поплавки один за другим, а затем предпочтительнее решение для дубликатов безумия.

Спасибо

Ответы [ 2 ]

3 голосов
/ 31 августа 2010

Как насчет этого:

Pattern lastYearIncomePattern = java.util.regex.Pattern.compile("(.+\\{\\s)(([0-9]{1,2}\\.[0-9]{3}\\s){12})");

Matcher matcher = lastYearIncomePattern.matcher(input);
boolean found =matcher.find();
if(found){
  String[] values= matcher.group(2).split("\\s");
}

Работает.Было бы интересно узнать, можно ли это сделать за один раз, как вы надеялись.

1 голос
/ 31 августа 2010

Вы можете написать регулярное выражение для соответствия одному числу с плавающей запятой, а затем использовать Matcher.find (int) для итерации по вхождениям.

...