Вопрос
Мне нужно регулярное выражение 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}$/