如果你想匹配像模式:
1y2m3d45h6mi7s
您可以使用下面的正则表达式(online demo here):
(?:(\d+)y)?(?:(\d+)m(?!i))?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)mi)?(?:(\d+)s)?
正如你所看到的,它包括几个部分,如(?:(\d+)X)?
, X
是你想要匹配的时间段的字符。这意味着:
(?: open parenthesis, for "non-matching group"
(\d+) any number of digits
X followed by the character 'X'
)? and everything is optional
而且,月,(?:(\d+)m(?!i))?
,有负先行使其考虑1mi
1分钟而不是一个月加上焦炭i
(从另一个信息,即不是日期)。
而且一些Java代码与它(online demo here)工作:
public static void main(String[] args) throws java.lang.Exception {
parseInformation("1y30d");
parseInformation("1y2m30mi");
parseInformation("1y1mi");
parseInformation("1y2m3d4h5mi6s");
}
public static void parseInformation(String information) {
Pattern p = Pattern.compile("(?:(\\d+)y)?(?:(\\d+)m(?!i))?(?:(\\d+)d)?(?:(\\d+)h)?(?:(\\d+)mi)?(?:(\\d+)s)?");
Matcher m = p.matcher(information);
while (m.find()) {
if (m.group().isEmpty()) { continue; /* found nothing, go on */ }
System.out.println(information + " found: '"+m.group()+"'");
System.out.println("\t" + m.group(1) + " years");
System.out.println("\t" + m.group(2) + " months");
System.out.println("\t" + m.group(3) + " days");
System.out.println("\t" + m.group(4) + " hours");
System.out.println("\t" + m.group(5) + " minutes");
System.out.println("\t" + m.group(6) + " seconds");
System.out.println("");
}
输出:
...
1y2m3d4h5mi6s found: '1y2m3d4h5mi6s'
1 years
2 months
3 days
4 hours
5 minutes
6 seconds
这里是一个[互动REGEX教程](http://regexone.com/)。 – csmckelvey