Создайте регулярное выражение для извлечения часа и минуты из строки в JAVA - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь создать шаблон, который может дать мне часы и минуты из строки в JAVA.Что бы я ни пытался, один или несколько примеров терпят неудачу.

Может быть комбинация ниже.

  1. 1 час
  2. 2 часа
  3. 1 час 20 минут
  4. 3 часа 30 минут
  5. 3 часа 1 минута
  6. 1 час 1 минута
  7. 1 минута
  8. 10 минут

    Pattern p = Pattern.compile("([\\d]+)\\s+[hour|hours]*\\s*([\\d]*)[^\\d]*");
    
    
    Matcher m = p.matcher("8 hours 2 minutes");
    
    // if an occurrence if a pattern was found in a given string...
    if (m.find()) {
        System.out.println("found");
        System.out.println(m.group(1)); // hours
        System.out.println(m.group(2)); // minutes
    }
    

1 Ответ

0 голосов
/ 21 февраля 2019

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

^(?=.)(?:(?<hours>\d+) *hours?)?(?: *(?<minutes>\d+) *minutes?)?$

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

Демо

Также ознакомьтесь с этим кодом Java.

List<String> list = Arrays.asList("1 hour","2 hours","1 hour 20 minutes","3 hours 30 minutes","3 hours 1 minute","1 hour 1 minute","1 minute","10 minutes");
Pattern p = Pattern.compile("^(?=.)(?:(?<hours>\\d+) *hours?)?(?: *(?<minutes>\\d+) *minutes?)?$");

list.stream().forEach(x -> {
    Matcher m = p.matcher(x);
    if (m.matches()) {
        System.out.println(x + " ----> Hours: " + m.group("hours") + ", Minutes: " + m.group("minutes"));
    } else {
        System.out.println(x + " ----> Didn't match");
    }
});

Prints,

1 hour ----> Hours: 1, Minutes: null
2 hours ----> Hours: 2, Minutes: null
1 hour 20 minutes ----> Hours: 1, Minutes: 20
3 hours 30 minutes ----> Hours: 3, Minutes: 30
3 hours 1 minute ----> Hours: 3, Minutes: 1
1 hour 1 minute ----> Hours: 1, Minutes: 1
1 minute ----> Hours: null, Minutes: 1
10 minutes ----> Hours: null, Minutes: 10
...