http://jeremy.zawodny.com/blog/archives/010717.html :
#!/bin/bash
FAIL=0
echo "starting"
./sleeper 2 0 &
./sleeper 2 1 &
./sleeper 3 0 &
./sleeper 2 0 &
for job in `jobs -p`
do
echo $job
wait $job || let "FAIL+=1"
done
echo $FAIL
if [ "$FAIL" == "0" ];
then
echo "YAY!"
else
echo "FAIL! ($FAIL)"
fi
Используйте [0-9]
для сопоставления любой цифры. +
для соответствия 1 или более повторений. ?
для соответствия 0 или 1 повторению. ()
для группировки и извлечения вывода.
P (([0-9] + Y)? ([0-9] + M)? ([0-9] + D)? ) (Т ([0-9] + H)? ([0-9] + M)? ([0-9. ] + S)?)?
import re
>>> p = re.compile('P(([0-9]+Y)?([0-9]+M)?([0-9]+D)?)(T([0-9]+H)?([0-9]+M)?([0-9.]+S)?)?')
>>> p.match('P1Y3M2DT3H').groups()
('1Y3M2D', '1Y', '3M', '2D', 'T3H', '3H', None, None)
>>> p.match('P3M2DT3H').groups()
('3M2D', None, '3M', '2D', 'T3H', '3H', None, None)
>>> p.match('PT3H5M').groups()
('', None, None, None, 'T3H5M', '3H', '5M', None)
>>> p.match('P1Y3M4D').groups()
('1Y3M4D', '1Y', '3M', '4D', None, None, None, None)
JavaScript не поддерживает / x
(режим свободного пробела или комментариев), поэтому удалите пробелы из этого регулярного выражения перед его использованием.
/^P(?=.)
(?:\d+Y)?
(?:\d+M)?
(?:\d+D)?
(?:T(?=.)
(?:\d+H)?
(?:\d+M)?
(?:\d+
(?:\.\d{1,2})?
)?
)?$/i
Каждый (? =.)
Lookahead утверждает, что в этой точке совпадения остался хотя бы один символ. Это означает, что по крайней мере одна из следующих групп (т.е. группа Y, M, D или T после P и группа H, M или S после T) должна соответствовать, даже если все они являются необязательными. Это удовлетворяет второму из добавленных требований в обновленной спецификации.
Наша реализация SCORM Engine использует комбинацию регулярного выражения, аналогичного приведенным выше, и некоторую базовую логику JavaScript, которая выполняет дополнительную проверку.