Для этого вы можете использовать следующее регулярное выражение:
^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}
Конечно, вы можете использовать что-то вроде M*
разрешения, чтобы разрешить любое число (включая ноль) тысяч, если вы хотите разрешить большее число.
Далее (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
через 9
и также похож на предыдущие две секций (римские цифры, несмотря на их кажущуюся странность, следуют некоторым логическим правилам , как только вы выяснить , что они есть):
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
Просто помните, что это регулярное выражение также будет соответствовать пустой строке. Если вы не хотите этого (и ваш движок регулярных выражений достаточно современен), вы можете использовать позитивный прогноз и прогноз:
(?<=^)M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})(?=$)
(Другой вариант - просто проверить, что длина не равна нулю заранее).
MMMM
был правильный путь. Представление за решеткой появилось задолго до того, как основная империя распалась./^M{0,3}(?:C[MD]|D?C{0,3})(?:X[CL]|L?X{0,3})(?:I[XV]|V?I{0,3})$/i
На самом деле, ваша предпосылка ошибочна. 990 IS "XM", а также "CMXC".
Римляне были гораздо меньше озабочены «правилами», чем ваш учитель в третьем классе. Пока все сложилось, все было в порядке. Следовательно, «IIII» был таким же хорошим, как «IV» для 4. И «IIM» был совершенно крут для 998.
(Если у вас есть проблемы с этим ... Помните, что английское правописание не было формализовано до 1700-х годов. До тех пор, пока читатель мог понять это, это было достаточно хорошо).
источник
Просто чтобы сохранить его здесь:
Соответствует всем римским цифрам. Не заботится о пустых строках (требуется хотя бы одна буква римской цифры). Должен работать в PCRE, Perl, Python и Ruby.
Демоверсия Ruby онлайн: http://rubular.com/r/KLPR1zq3Hj
Преобразование в Интернете: http://www.onlineconversion.com/roman_numerals_advanced.htm
источник
Чтобы избежать сопоставлений пустой строки , которую вы должны будете повторять рисунок на четыре раза , и заменить каждый
0
с ,1
в свою очередь, и учитыватьV
,L
иD
:В этом случае (потому что этот шаблон использует
^
и$
) вам лучше сначала проверить пустые строки и не пытаться их сопоставить. Если вы используете границы слов, то у вас нет проблем, потому что нет такого понятия, как пустое слово. (По крайней мере, регулярное выражение не определяет один; не начинайте философствовать, я здесь прагматичен!)В моем собственном конкретном (реальном мире) случае мне нужны были цифры соответствия в конце слова, и я не нашел другого способа обойти это. Мне нужно было вычистить от номеров сносок от моего обычного текстового документа, в котором текст , такие как «Красное море сл и Большой Барьерный Риф кли » был преобразован в
the Red Seacl and the Great Barrier Reefcli
. Но у меня все еще были проблемы с действительными словами, такими какTahiti
иfantastic
вымыты вTahit
иfantasti
.источник
M
или,C
илиL
, так, у вас есть это вид упрощенного регулярного выражения?(X{1,3}(IX|IV|V?I{0,3})|X{0,3}(IX|I?V|V?I{1,3}))
К счастью, диапазон номеров ограничен 1..3999 или около того. Таким образом, вы можете создать регулярное блюдо.
Каждая из этих частей будет иметь дело с капризами римской нотации. Например, используя запись Perl:
Повторите и соберите.
Добавлено :
<opt-hundreds-part>
Может быть сжато дальше:Поскольку предложение 'D? C {0,3}' не может соответствовать никому, знак вопроса не требуется. И, скорее всего, скобки должны быть не захватывающего типа - в Perl:
Конечно, все должно быть без учета регистра.
Вы также можете расширить это, чтобы иметь дело с опциями, упомянутыми Джеймсом Керраном (чтобы разрешить XM или IM для 990 или 999 и CCCC для 400 и т. Д.).
источник
thousands hundreds tens units
, что легко создать FSM, который вычисляет и проверяет данные римскими цифрамиДля людей, которые действительно хотят понять логику, пожалуйста, ознакомьтесь с пошаговым объяснением на 3 страницах по diveintopython .
Единственное отличие от оригинального решения (которое имело
M{0,4}
) состоит в том, что я обнаружил, что «ММММ» не является действительным римским числом (также старые римляне, скорее всего, не думали об этом огромном числе и не согласятся со мной). Если вы один из неприличных старых римлян, пожалуйста, простите меня и используйте версию {0,4}.источник
Я отвечаю на этот вопрос Регулярное выражение в Python для римских цифр здесь,
потому что оно было помечено как точная копия этого вопроса.
Оно может быть похожим по названию, но это конкретный вопрос / проблема регулярного выражения,
как видно из этого ответа на этот вопрос.
Разыскиваемые элементы могут быть объединены в одно чередование, а затем
заключены в группу захвата, которая будет помещена в список с помощью функции findall ()
.
Это делается так:
Модификации regex для разложения и захвата только цифр таковы:
источник
Как Джереми и Пакс указывали выше ... '^ M {0,4} (CM | CD | D? C {0,3}) (XC | XL | L? X {0,3}) (IX | IV | V? I {0,3}) $ 'должно быть решением, которое вы ищете ...
Конкретный URL, который должен был быть прикреплен (IMHO): http://thehazeltree.org/diveintopython/7.html
Пример 7.8 - это краткая форма с использованием {n, m}
источник
В моем случае я пытался найти и заменить все вхождения римских чисел одним словом в тексте, поэтому я не мог использовать начало и конец строк. Таким образом, решение @paxdiablo нашло много совпадений нулевой длины. Я закончил со следующим выражением:
Мой окончательный код Python был таким:
Вывод:
источник
Стивен Левитан использует это регулярное выражение в своем посте, который проверяет римские цифры перед тем, как «дероманизировать» значение:
источник
Я видел несколько ответов, которые не охватывают пустые строки или используют загадки для решения этой проблемы. И я хочу добавить новый ответ, который охватывает пустые строки и не использует прогнозирование. Это регулярное выражение:
^(I[VX]|VI{0,3}|I{1,3})|((X[LC]|LX{0,3}|X{1,3})(I[VX]|V?I{0,3}))|((C[DM]|DC{0,3}|C{1,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3}))|(M+(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3}))$
Я допускаю бесконечное
M
,M+
но, конечно, кто-то может изменить,M{1,4}
чтобы разрешить только 1 или 4 при желании.Ниже приведена визуализация, которая помогает понять, что она делает, и ей предшествуют две онлайн-демонстрации:
Debuggex Demo
Regex 101 Demo
источник
Это работает в Java и механизмах регулярных выражений PCRE и теперь должно работать в последней версии JavaScript, но может работать не во всех контекстах.
(?<![A-Z])(M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))(?![A-Z])
Первая часть - отвратительный негативный взгляд. Но для логических целей это легче всего понять. По сути, первый
(?<!)
говорит, что не соответствует середине,([MATCH])
если есть буквы перед серединой,([MATCH])
а последний(?!)
говорит, что не соответствует середине([MATCH])
если есть буквы после него.Середина
([MATCH])
- это наиболее часто используемое регулярное выражение для сопоставления последовательности римских цифр. Но теперь вы не хотите соответствовать этому, если вокруг него есть буквы.Посмотреть на себя. https://regexr.com/4vce5
источник
Проблема решения от Джереми и Пакса состоит в том, что оно также соответствует «ничему».
Следующее регулярное выражение ожидает по крайней мере одну римскую цифру:
источник
|
может соответствовать пустой строке и всем допустимым римским цифрам, поэтому правая часть полностью избыточна. и да, он по-прежнему соответствует пустой строке.Я бы написал функции для моей работы для меня. Вот две функции римской цифры в PowerShell.
источник