Как Вы соответствуете только допустимым римским цифрам регулярному выражению?

152
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

Попытка:

^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$

Разрушение его:

<час>

M{0,4}

Это определяет тысячи раздела и в основном ограничивает его к между 0 и 4000. Это - относительно простое:

   0: <empty>  matched by M{0}
1000: M        matched by M{1}
2000: MM       matched by M{2}
3000: MMM      matched by M{3}
4000: MMMM     matched by M{4}
<час>

(CM|CD|D?C{0,3})

Немного более сложный, это для сотен раздела и покрывает все возможности:

  0: <empty>  matched by D?C{0} (with D not there)
100: C        matched by D?C{1} (with D not there)
200: CC       matched by D?C{2} (with D not there)
300: CCC      matched by D?C{3} (with D not there)
400: CD       matched by CD
500: D        matched by D?C{0} (with D there)
600: DC       matched by D?C{1} (with D there)
700: DCC      matched by D?C{2} (with D there)
800: DCCC     matched by D?C{3} (with D there)
900: CM       matched by CM
<час>

(XC|XL|L?X{0,3})

Те же правила как предыдущий раздел, но для места десятков:

 0: <empty>  matched by L?X{0} (with L not there)
10: X        matched by L?X{1} (with L not there)
20: XX       matched by L?X{2} (with L not there)
30: XXX      matched by L?X{3} (with L not there)
40: XL       matched by XL
50: L        matched by L?X{0} (with L there)
60: LX       matched by L?X{1} (with L there)
70: LXX      matched by L?X{2} (with L there)
80: LXXX     matched by L?X{3} (with L there)
90: XC       matched by XC
<час>

(IX|IV|V?I{0,3})

Это - раздел единиц, обрабатывая 0 до [1 112] и также подобный предыдущим двум разделам (Римские цифры, несмотря на их кажущуюся странность, следуйте некоторым логическим правилам, как только Вы выясняете то, что они):

0: <empty>  matched by V?I{0} (with V not there)
1: I        matched by V?I{1} (with V not there)
2: II       matched by V?I{2} (with V not there)
3: III      matched by V?I{3} (with V not there)
4: IV       matched by IV
5: V        matched by V?I{0} (with V there)
6: VI       matched by V?I{1} (with V there)
7: VII      matched by V?I{2} (with V there)
8: VIII     matched by V?I{3} (with V there)
9: IX       matched by IX
314
ответ дан paxdiablo 23 November 2019 в 22:08
поделиться

На самом деле Ваша предпосылка испорчена. 990 "XM", а также "CMXC".

римляне были намного менее обеспокоены "правилами", чем Ваш учитель третьего класса. Пока это сложило, это было в порядке. Следовательно "IIII" было так же хорошо как "IV" для 4. И "IIM" был абсолютно прохладен для 998.

(Если Вы испытываете затруднения при контакте с этим... Помните, что английские написания не были формализованы до 1700-х. До тех пор пока читатель мог понять его, это было достаточно хорошо).

20
ответ дан Jonathan Leffler 23 November 2019 в 22:08
поделиться

К счастью, диапазон чисел ограничен 1.. 3999 или поблизости. Поэтому можно создать regex по частям.

<opt-thousands-part><opt-hundreds-part><opt-tens-part><opt-units-part>

Каждая из тех частей будет иметь дело с капризами римской нотации. Например, использование нотации Perl:

<opt-hundreds-part> = m/(CM|DC{0,3}|CD|C{1,3})?/;

Повторение и собираются.

Добавленный : Эти <opt-hundreds-part> может быть сжат далее:

<opt-hundreds-part> = m/(C[MD]|D?C{0,3})/;

Начиная с 'D? C {0,3}' пункт ничему не может соответствовать, нет никакой потребности в вопросительном знаке. И скорее всего, круглые скобки должны быть типом неполучения - в Perl:

<opt-hundreds-part> = m/(?:C[MD]|D?C{0,3})/;

, Конечно, это должно все быть нечувствительно к регистру, также.

можно также расширить это для контакта с опциями, упомянутыми James Curran (для разрешения XM или IM для 990 или 999, и CCCC для 400, и т.д.).

<opt-hundreds-part> = m/(?:[IXC][MD]|D?C{0,4})/;
7
ответ дан Jonathan Leffler 23 November 2019 в 22:08
поделиться

Поскольку Jeremy и Мир указали выше... '^M {0,4} (CM|CD|D? C {0,3}) (XC|XL|L? X {0,3}) (IX|IV|V? Я {0,3}) $' должен быть решением, которое Вы после...

определенный URL, который должен был быть присоединен (по моему скромному мнению), http://thehazeltree.org/diveintopython/7.html

, Примером 7.8 является краткое использование {n, m}

1
ответ дан Jonathan Leffler 23 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: