2016-08-29 3 views
-4

Существует очень полезная статья о том, как подтвердить римские цифры How do you match only valid roman numerals with a regular expression?Как вы сопоставляете действительные целые числа и римские цифры с регулярным выражением?

Regex всегда была моей ахиллесовой пяткой, несмотря на все мои усилия. Как расширить регулярное выражение для соответствия целых чисел normal? Предоставленное регулярное выражение:

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

Можете ли вы еще раз объяснить, какие виды ввода должны пройти проверку? Может ли арабская цифра появляться внутри римской цифры? Если нет, то комментарий @Wiktor должен сделать трюк. –

+0

@ WiktorStribiżew: не совсем хороший дубликат. – Cerbrus

+0

@TimBiegeleisen: Я знаю, где я говорю, что «нормальные» целые числа могут означать разные вещи для разных людей ... в моем случае я просто имел в виду 1, 2, 3, ... –

ответ

2

Предполагая, что вы просто хотите десятичных целые чисел в обычной форме (например, 1000 будет действительным, 1e3 [такое же число в экспоненциальном] бы не так), регулярное выражение подтвердите, что это \d+, что означает «одна или несколько цифр».

Чтобы ваше регулярное выражение разрешало это, вам понадобится чередование , которое позволяет использовать любую из двух альтернатив. Чередование представлено в форме first|second, где first и second являются альтернативами.

Поскольку текущее выражение имеет «начало» и «конец» входные утверждения (^ и $), мы либо хотим включить те во второй альтернативе, а также, или положить все чередование в не-захвате группа.

Так как:

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

(on regex101)

или

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

(on regex101)

Обратите внимание, что ваше исходное выражение имеет несколько захвата групп (но Безразлично» t полностью состоит из захватов); если вы хотите захватить\d+ часть, вы бы положили () вокруг него.

+0

@ Crowder: Я знаю, что целые числа могут означать разные вещи для разных людей ... в моем случае я просто имел в виду 1, 2, 3, ... –

+0

@JohnGathogo: Просто создайте проблему, чтобы решить ее. Иногда люди тоже хотят обрабатывать научную нотацию, что немного усложняет ситуацию. –

+0

@ Crowder: Я понимаю. Моя задача всегда заключалась в объединении двух или более выражений регулярных выражений таким образом, что комбинированное выражение имеет ожидаемый результат. Это то, что я никогда не осваиваю. –

Смежные вопросы