У меня есть такие строки:

36600.10: [Host #255] utilization is 0.00%
36600.10: [Host #256] utilization is 21.64%
36600.10: [Host #257] utilization is 3.29%
36600.10: [Host #258] utilization is 0.94%
36600.10: [Host #260] utilization is 3.76%
36600.10: [Host #260] utilization is 1.21%
36600.10: [Host #260] utilization is 86.09%
36600.10: [Host #260] utilization is 7.32%

Мне нужно получить все числа после использование. Мне нужен такой массив:

myArray[0] => 0.00,
myArray[1] => 21.64,
myArray[2] => 3.29,
myArray[3] => 0.94,
myArray[4] => 3.76,
myArray[5] => 1.21,
myArray[6] => 7.32

То, что я пробовал до сих пор (работает только для первой строки):

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class main {

    public static void main(String[] args) {
          String lines = "36600.10: [Host #256] utilization is 21.65% \n 36600.10: [Host #256] utilization is 91.78% \n 36600.10: [Host #256] utilization is 3.29%";
          String pattern = "(utilization is\\s)(\\d+\\.\\d*)(.*)";

          Pattern r = Pattern.compile(pattern);

          Matcher m = r.matcher(lines);
          if (m.find( )) {
             System.out.println(m.group(2));
          } else {
             System.out.println("NO MATCH");
          }

    }

}

Извините, я новичок в java, пробовал несколько шаблонов, но не помогло. Любая помощь будет принята с благодарностью.

Hamed Kamrava

Ответов: 4

Ответы (4)

Use While loop. If statement will limit the match with the first occurence (Which is happening)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class main {

    public static void main(String[] args) {
          String lines = "36600.10: [Host #256] utilization is 21.65% \n 36600.10: [Host #256] utilization is 91.78% \n 36600.10: [Host #256] utilization is 3.29%";
          String pattern = "(utilization is\\s)(\\d+\\.\\d*)(.*)";

          Pattern r = Pattern.compile(pattern);

          Matcher m = r.matcher(lines);
         while (m.find()) {
             System.out.println(m.group(2));
          } 
    }

}

Это можно решить без регулярного выражения, по крайней мере, в этом случае, после просмотра шаблона вашего ввода.

List list = new ArrayList();
        list.add("36600.10: [Host #255] utilization is 0.00%");
        list.add("36600.10: [Host #256] utilization is 21.64%");
        list.add("36600.10: [Host #255] utilization is 3.29%");
        for(int i=0 ; i

Вы можете использовать более одного регулярного выражения. * И ... есть несколько решений. Один из них - заменить лишний текст пробелами. Затем используйте эти пробелы, чтобы разделить строку. То есть:

• Код:

String [] array = lines.replaceAll ("(? M). * Is \\ s + |% \\ s *", "") .trim (). Split ("\\ s +") ;
System.out.println (Arrays.toString (массив));

• Вывод:

[0,00, 21,64, 3,29, 0,94, 3,76, 1,21, 86,09, 7,32]

─────────────
* Кстати, Regular-Expressions.info - Учебник по регулярным выражениям, примеры и справочная информация - Шаблоны регулярных выражений - хорошее место для начала изучения регулярных выражений.Mastering Regular Expressions, 3rd Edition - настоятельно рекомендуемая книга.

Вы также можете сделать это с помощью функции разделения, если хотите -

String lines = "36600.10: [Host #256] utilization is 21.65% \n 36600.10: [Host #256] utilization is 91.78% \n 36600.10: [Host #256] utilization is 3.29%";
        String lineArray[] = lines.split("\n");
        for(String temp:lineArray){
            String percentWithSign = temp.split("utilization is")[1];
            String percentStr  = percentWithSign.replace("%", "");
            Float percentFloat = Float.parseFloat(percentStr);
            System.out.println(percentFloat);
        }

2022 WebDevInsider