С моей точки зрения регулярное выражение (m*)(d?c{0,3}|c[dm])(l?x{0,3}|x[lc])(v?i{0,3}|i[vx]) должно описывать любое число записанное римскими цифрами, причем выделенные подобразцы задают соответственно тысячи, сотни, десятки и единицы.
И действительно, при сопоставлении образца ^(m*)(d?c{0,3}|c[dm])(l?x{0,3}|x[lc])(v?i{0,3}|i[vx])$ (обращаю внимание на ^...$, т.е. число есть строка целиком) со строкой "mmmccxcvii" (3297) все отлично, и мы получаем соответственно mmm, cc, xc и vii.
Но стоит убрать символы начала (^) и конца ($) строки и сопоставить образец (m*)(d?c{0,3}|c[dm])(l?x{0,3}|x[lc])(v?i{0,3}|i[vx]) со строкой вида "123 mmmccxcvii 456", например, совпадения нет вообще.
В чем заковыка?
У меня два совпадения:
123 mmmccxcvii 456
123 mmmccxcvii 456
Ubuntu 10.04
320m18 (9502)
А более "оптимистичная" маска (m*)(c[dm]|d?c{0,3})(x[lc]|l?x{0,3})(i[vx]|v?i{0,3}) оказывается более жадной и ищет правильно!
хм... ООО и у меня ищет и находит, а javascript не находит