如果你想匹配像模式:
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