Почему я не могу найти конкретное выражения Java

160
20 февраля 2019, 23:20

Без Pattern данные выводятся такие:
USD 27.827 28.161 -0.040 -0.040 28.0035 28.004 -0.046 -0.046 28.002897 28.003 -0.079 -0.079 EUR 31.932 +0.083 +0.083 32.595 +0.085 +0.085 32.3723 32.372 +0.065 +0.065 32.203332 32.203 +0.092 +0.092 RUB 0.369 -0.004 -0.004 0.432 -0.002 -0.002 0.4203 0.420 0.423110 0.423 GBP 35.809 +0.188 +0.188 37.474 +0.184 +0.184 36.9582 36.958 -0.029 -0.029 36.825692 36.826 +0.203 +0.203 CHF 27.229 +0.110 +0.110 28.693 +0.087 +0.087 28.3216 28.322 -0.004 -0.004 28.218832 28.219 +0.004 +0.004 PLN 7.058 +0.010 +0.010 7.595 -0.090 -0.090 7.4833 7.483 +0.013 +0.013 7.472464 7.472 +0.032 +0.032 JPY 0.238 0.251 +0.001 +0.001 0.2495 0.250 0.247280 0.247 -0.001 -0.001 CAD 20.055 -0.170 -0.170 21.700 21.4660 21.466 21.602825 21.603 -0.005 -0.005 AUD 19.430 -0.020 -0.020 20.160 -0.140 -0.140 19.8671 19.867 +0.099 +0.099 19.871240 19.871 +0.053 +0.053 DKK 4.100 4.350 +0.010 +0.010 4.3226 4.323 +0.006 +0.006 4.316743 4.317 +0.012 +0.012 NOK 3.280 3.430 +0.020 +0.020 3.4095 3.409 +0.005 +0.005 3.408914 3.409 +0.026 +0.026 SEK 2.970 -0.010 -0.010 3.100 3.1148 3.115 +0.047 +0.047 3.072837 3.073 -0.002 -0.002 CZK 1.190 1.293 1.2482 1.248 1.247853 1.248 +0.003 +0.003 HUF 0.091 0.103 0.0992 0.099 0.099072 0.099

А я пробую вывести только название валюты то есть (USD И ТАК ДАЛЕ) потом курс то есть (27.827 28.161 ) потом комерческий курс(28.0035) и НБУ (28.002897). USD 27.827 28.161 28.0035 28.002897 EUR.....PLN....

Никак не получается, подскажите что я не так делаю и как исправить?

private static String getOnlyKyrsi(String only) throws Exception{
Pattern pattern = Pattern.compile("([A-Z]){1,}\\s([0-9]){1,}\\.([0-9]){1,}\\s([^-+])")  ;
    Matcher matcher = pattern.matcher(only);
    if(matcher.find()){
        return matcher.group();         
        }
    throw new Exception("Ne mogy naiti");
    }
public static void main( String[] args ) throws Exception{
   Document doc = (Document) Jsoup.connect("https://kurs.com.ua/gorod/1217-lvov/").get();
   Element kursi = doc.select("table[class = ipsTable ipsKursTable ipsKursTable_board ipsKursTable_summary]").first();
   Elements body = kursi.select("tbody[data-role= tableRows");   
   String body1 = kursi.select("tbody[data-role= tableRows").text();
  System.out.println(body1);
 for (Element body2:body){  
       String others = body2.select("tr[class]").text();
       String kursiValut = getOnlyKyrsi(others);
       System.out.println(kursiValut);
   }
Answer 1

Зачем вам использовать regexp, когда можно все спокойно сделать средствами jsoup?

Element body = kursi.select("tbody[data-role= tableRows").get(0);
        Elements allLines = body.select("tr");
        for (Element line : allLines) {
            String currency = line.select("td[class = ipsKursTable_currency ipsType_center]").text();
            String bidPrice = line.select("td[data-rate-type=bid]").text();
            //и так далее для всех нужных аттрибутов
        }
Answer 2

Если решили именно парсить строку, то удобнее будет сделать так:

String str = "USD 27.827 28.161 -0.040 -0.040 28.0035 28.004 -0.046 -0.046 28.002897 28.003 -0.079 -0.079 EUR 31.932 +0.083 +0.083 32.595 +0.085 +0.085 32.3723 32.372 +0.065 +0.065 32.203332 32.203 +0.092 +0.092";
for (String val : str.split(" (?=[A-Z]+)")) {
   String[] splitVal = val.split(" ");
   // Здесь splitVal по индексу 0 будет содержать название валюты, 
   // а в последующих индексах значения идущие после нее.
} 
READ ALSO
Сравнение объектов оператором == в Java. Integer vs int

Сравнение объектов оператором == в Java. Integer vs int

Для сравнения объектов в Java используется метод equals(), но что если сравниваются между собой два объекта-обертки для примитивных типов:

212
Повторить одну строку в столбик, через итератор и цикл (при условии)

Повторить одну строку в столбик, через итератор и цикл (при условии)

Нужно реализовать повтор строки в столбик 1 раз (если то условие выполняется)Ниже выделил где именно это происходит

182
Как использовать logger.info(из log4j) в консоли вместо print?

Как использовать logger.info(из log4j) в консоли вместо print?

Надо выводить какие-то действия в консоль + логировать их в файлЯ сделал это с помощью log4j

177
java CsvToBeanBuilder

java CsvToBeanBuilder

Пытаюсь считать csv файл

222