Regex for ISO 8601 Duration
Regex Pattern
^P(?!$)(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?!$)(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$ISO 8601 duration format (e.g. P1Y2M3DT4H5M6S)
Quick Answer
The regex pattern for iso 8601 duration is `^P(?!$)(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?!$)(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$`. ISO 8601 duration format (e.g. P1Y2M3DT4H5M6S). This works in JavaScript, Python, Ruby, PHP, Java, and most regex engines that support PCRE syntax.
Test Examples
| Input | Result |
|---|---|
| P1Y | ✓ Matches |
| P2M3D | ✓ Matches |
| PT1H30M | ✓ Matches |
| P1Y2M3DT4H5M6.5S | ✓ Matches |
| P | ✗ No match |
| PT | ✗ No match |
| 1Y2M | ✗ No match |
| P1X | ✗ No match |
Code Examples
javascript
const regex = /^P(?!$)(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?!$)(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/; const isValid = regex.test(value);
python
import re
pattern = r'^P(?!$)(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?!$)(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$'
if re.match(pattern, value):
print("valid")ruby
pattern = /^P(?!$)(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?!$)(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/ if value =~ pattern puts "valid" end
php
if (preg_match('/^P(?!$)(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?!$)(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/', $value)) {
echo "valid";
}java
String pattern = "^P(?!$)(?:\\d+Y)?(?:\\d+M)?(?:\\d+W)?(?:\\d+D)?(?:T(?!$)(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$"; boolean isValid = value.matches(pattern);
Frequently Asked Questions
Related Regex Patterns
Date YYYY-MM-DD
ISO 8601 date format
Date DD/MM/YYYY
European date format with slashes
24-Hour Time
24-hour clock time in HH:MM format
12-Hour Time with AM/PM
12-hour clock with AM/PM
Date MM/DD/YYYY
US date format with slashes (MM/DD/YYYY)
ISO 8601 Full DateTime
Full ISO 8601 datetime with timezone (YYYY-MM-DDThh:mm:ssZ)