Как отфильтровать текст от URL - PullRequest
1 голос
/ 23 апреля 2019

Мне нужно найти нужную строку, которая начинается с 'c' и заканчивается указанной датой. Например: я хочу найти 2019-02-05, чтобы строка выглядела следующим образом: c025z190205. Так что единственное, что я знаю, это c и date. Это просто пример, поэтому я могу ввести любую дату, и она должна напечатать мне именно эту строку. Текстовый файл выглядит так:

c001z190102
h001z190102
a001z190102
b001z190102
c002z190103
h002z190103
a002z190103
c003z190104
h003z190104
a003z190104
c004z190107
h004z190107
a004z190107
c005z190108
h005z190108
a005z190108
c006z190109
h006z190109
a006z190109
b002z190109
c007z190110
h007z190110
a007z190110
c008z190111
h008z190111
a008z190111
c009z190114
h009z190114
a009z190114
c010z190115
h010z190115
a010z190115
c011z190116
h011z190116
a011z190116
b003z190116
c012z190117
h012z190117
a012z190117
c013z190118
h013z190118
a013z190118
c014z190121
h014z190121
a014z190121
c015z190122
h015z190122
a015z190122
c016z190123
h016z190123
a016z190123
b004z190123
c017z190124
h017z190124
a017z190124
c018z190125
h018z190125
a018z190125
c019z190128
h019z190128
a019z190128
c020z190129
h020z190129
a020z190129
c021z190130
h021z190130
a021z190130
b005z190130
c022z190131
h022z190131
a022z190131
c023z190201
h023z190201
a023z190201
c024z190204
h024z190204
a024z190204
c025z190205
h025z190205
a025z190205
c026z190206
h026z190206
a026z190206
b006z190206
c027z190207
h027z190207
a027z190207
c028z190208
h028z190208
a028z190208
c029z190211
h029z190211
a029z190211
c030z190212
h030z190212
a030z190212
c031z190213
h031z190213
a031z190213
b007z190213
c032z190214
h032z190214
a032z190214
c033z190215
h033z190215
a033z190215
c034z190218
h034z190218
a034z190218
c035z190219
h035z190219
a035z190219
c036z190220
h036z190220
a036z190220
b008z190220
c037z190221
h037z190221
a037z190221
c038z190222
h038z190222
a038z190222
c039z190225
h039z190225
a039z190225
c040z190226
h040z190226
a040z190226
c041z190227
h041z190227
a041z190227
b009z190227
c042z190228
h042z190228
a042z190228
c043z190301
h043z190301
a043z190301
c044z190304
h044z190304
a044z190304
c045z190305
h045z190305
a045z190305
c046z190306
h046z190306
a046z190306
b010z190306
c047z190307
h047z190307
a047z190307
c048z190308
h048z190308
a048z190308
c049z190311
h049z190311
a049z190311
c050z190312
h050z190312
a050z190312
c051z190313
h051z190313
a051z190313
b011z190313
c052z190314
h052z190314
a052z190314
c053z190315
h053z190315
a053z190315
c054z190318
h054z190318
a054z190318
c055z190319
h055z190319
a055z190319
c056z190320
h056z190320
a056z190320
b012z190320
c057z190321
h057z190321
a057z190321
c058z190322
h058z190322
a058z190322
c059z190325
h059z190325
a059z190325
c060z190326
h060z190326
a060z190326
c061z190327
h061z190327
a061z190327
b013z190327
c062z190328
h062z190328
a062z190328
c063z190329
h063z190329
a063z190329
c064z190401
h064z190401
a064z190401
c065z190402
h065z190402
a065z190402
c066z190403
h066z190403
a066z190403
b014z190403
c067z190404
h067z190404
a067z190404
c068z190405
h068z190405
a068z190405
c069z190408
h069z190408
a069z190408
c070z190409
h070z190409
a070z190409
c071z190410
h071z190410
a071z190410
b015z190410
c072z190411
h072z190411
a072z190411
c073z190412
h073z190412
a073z190412
c074z190415
h074z190415
a074z190415
c075z190416
h075z190416
a075z190416
c076z190417
h076z190417
a076z190417
b016z190417
c077z190418
h077z190418
a077z190418
c078z190419
h078z190419
a078z190419
c079z190423
h079z190423
a079z190423

У меня уже есть BufferedReader. Я не знаю, если я должен regex или что-то, если да, то как это будет выглядеть?

try {
                String DIR_SOURCE = "http://www.nbp.pl/kursy/xml/dir.txt";
                URL url = new URL(DIR_SOURCE);
                URLConnection con = url.openConnection();
                InputStream is = con.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));



            } catch (Exception e) {
                e.printStackTrace();
            }

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Если вы ищете конкретную дату, то вы знаете, как построить начало строки, поэтому вы можете сделать:

String stringToFind = buildString(date);
String line;
while ((line = br.readLine()) != null) {
  if (line.startsWith(stringToFind)) {
    // do something...

    break;
  }
}

2 голосов
/ 24 апреля 2019

Вы можете использовать API Java Stream для фильтрации строк и генерации регулярного выражения для строки, которую хотите найти:

URL url = new URL("http://www.nbp.pl/kursy/xml/dir.txt");
URLConnection conn = url.openConnection();
Pattern identifier = getIdentifier("c", LocalDate.of(2019, Month.FEBRUARY, 5));
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
    reader.lines()
            .filter(line -> identifier.matcher(line).matches())
            .forEach(System.out::println);
}

В этом примере используется LocalDate, но вы можете легко поменять его на String или что вам больше нравится. Метод getIdentifier() может выглядеть следующим образом:

private Pattern getIdentifier(String start, LocalDate date) {
    return Pattern.compile(start + ".*" + date.format(DateTimeFormatter.ofPattern("YYMMdd")));
}

Шаблон для вашего примера будет c.*190205.

0 голосов
/ 23 апреля 2019

использование:

Pattern pattern = Pattern.compile("^c(.)*[0-9]{6}$");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...