Using Pattern
is the smart way. But why not use one to get all four fields?
Pattern p = Pattern.compile("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s");
Then use indexed group sampling.
EDIT:
Based on your idea, I ended up writing the following method
private static Pattern p = Pattern .compile("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s"); public static long parseDuration(String duration) throws ParseException { Matcher m = p.matcher(duration); long milliseconds = 0; if (m.find() && m.groupCount() == 4) { int days = Integer.parseInt(m.group(1)); milliseconds += TimeUnit.MILLISECONDS.convert(days, TimeUnit.DAYS); int hours = Integer.parseInt(m.group(2)); milliseconds += TimeUnit.MILLISECONDS .convert(hours, TimeUnit.HOURS); int minutes = Integer.parseInt(m.group(3)); milliseconds += TimeUnit.MILLISECONDS.convert(minutes, TimeUnit.MINUTES); int seconds = Integer.parseInt(m.group(4)); milliseconds += TimeUnit.MILLISECONDS.convert(seconds, TimeUnit.SECONDS); } else { throw new ParseException("Cannot parse duration " + duration, 0); } return milliseconds; }
source share