Вопрос

Мне нужно регулярное выражение CLR для дробей или целых чисел и дробей, где

1/2 правильно 12 2/3 тоже верно

и знак минус могут появляться перед любым числом.

Сначала я придумал -? ([0-9] *)? -? [0-9] + \ / -? [0-9] + , но, похоже, это позволяет < code> 2/7 12 тоже, например.

Это было полезно?

Решение

Хорошо, это регулярное выражение будет состоять из двух частей, (необязательно) целого числа:

(:?-?\d+ )?

и дробная часть:

-?\d+/-?\d+

И нам нужно сопоставить полную строку; так:

^(:?-?\d+ )?-?\d+/-?\d+$

Тестирование немного:

PS> $re=[regex]'^(:?-?\d+ )?-?\d+/-?\d+

Однако это позволяет использовать " -12 -2 / -3 " или такие вещи, как " 1 -1 / 2 " , которые не имеет большой смысл.

ETA: ваш оригинальное регулярное выражение тоже работает. Ему просто не хватало якорей для начала и конца строки ( ^ и $ соответственно). Добавление тех заставляет это работать правильно.

PS> "1/2","12 1/2","-12 2/3","-5/8","5/-8"|%{

Хорошо, это регулярное выражение будет состоять из двух частей, (необязательно) целого числа:

(:?-?\d+ )?

и дробная часть:

-?\d+/-?\d+

И нам нужно сопоставить полную строку; так:

^(:?-?\d+ )?-?\d+/-?\d+$

Тестирование немного:

<*>

Однако это позволяет использовать " -12 -2 / -3 " или такие вещи, как " 1 -1 / 2 " , которые не имеет большой смысл.

ETA: ваш оригинальное регулярное выражение тоже работает. Ему просто не хватало якорей для начала и конца строки ( ^ и $ соответственно). Добавление тех заставляет это работать правильно.

-match $re} | gu True

Однако это позволяет использовать " -12 -2 / -3 " или такие вещи, как " 1 -1 / 2 " , которые не имеет большой смысл.

ETA: ваш оригинальное регулярное выражение тоже работает. Ему просто не хватало якорей для начала и конца строки ( ^ и $ соответственно). Добавление тех заставляет это работать правильно.

Другие советы

У меня просто было похожее требование, но я также хотел сопоставить и десятичные числа. Я придумал следующее регулярное выражение

^-?(?<WholeNumber>\d+)(?<Partial>(\.(?<Decimal>\d+))|(/(?<Denomiator>\d+))|(\s(?<Fraction>\d+/\d+)))?$

Или просто так, если вы не хотите именованных групп

^-?\d+((\.\d+)|(/\d+)|(\s\d+/\d+))?$

Чтобы удалить десятичное число из проверки, оно будет сокращено до

^-?\d+((/\d+)|(\s\d+/\d+))?$

Надеюсь, это кому-нибудь поможет!

попробуйте это только для одной дроби, а не для целого числа

/^\d{1}\/?\d{1}$/
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top