Регулярные числа с 0 или 1 - следуют по номерам - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь сопоставить эту строку, но я не приступаю к работе. Строка может содержать только цифры или цифры с 1 чертой, за которой следует другой набор цифр.

Формула моего регулярного выражения:

^([0-9]*|[0-9]*\-{1}[0-9]*)$

EX:

Этот пропуск

123

Этот проход

123-123

Это должно не получиться, но оно проходит

123-

Ответы [ 5 ]

2 голосов
/ 22 марта 2019

Это должен быть самый простой и эффективный способ сделать это:

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

^[0-9]+(?:-[0-9]+)?$*

  • \dэто набор символов, доступный в большинстве разновидностей регулярных выражений, который представляет [0-9].Это более краткий способ сопоставления чисел, но если вы предпочитаете [0-9], вы можете просто использовать его вместо этого.

  • Обратите внимание, что ваш исходный шаблон и шаблоны, предложенные другими в качестве ответов, включены здеськвантификатор {1} после дефиса.Этого следует избегать, так как это всегда избыточно.Один символ без квантификатора эквивалентен тому же самому символу, за которым следует {1}.

* Редактировать: Wiktor поднял что-то, о чем я не знал.В некоторых вариантах регулярных выражений \d включает все цифры Unicode, а не только цифры от 0 до 9. Если это проблема, вы можете просто использовать шаблон ^[0-9]+(?:-[0-9]+)?$

1 голос
/ 22 марта 2019

Вы очень близки!

Квантор * соответствует 0 или более цифрам.

Вам нужен квантификатор +, который соответствует 1 или более цифрам.

Изменение вашего примера:

^([0-9]*|[0-9]+\-{1}[0-9]+)$

Не будет совпадать ни с чем, с одним числом или с номером

1 голос
/ 22 марта 2019

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

Если вы хотите хотя бы одно число после тире, используйте + вместо звезды.

^([0-9]*|[0-9]*\-{1}[0-9]+)$
0 голосов
/ 22 марта 2019

Для забавы вот несколько ответов без регулярных выражений. Я считаю, что их легче читать.

Если -123 и 123--123 не разрешены:

s.Split('-').All(x => x != string.Empty && x.All(char.IsDigit));

Элемент Foreach между -, мы проверяем, что этот элемент не пустой и состоит только из числа.

Если -123 и 123--123 разрешены:

!s.EndsWith("-") && s.All(c => c == '-' || char.IsDigit(c));

Убедитесь, что строка s не заканчивается на - и что s состоит из - и только цифр.

Попробуйте онлайн!

Обратите внимание, что char.IsDigit позволит ๔๕๖๗๘๙໐໑-௫௬௭௮. Если вы не хотите совпадать с этим, замените char.IsDigit() на IsDigit():

public static bool IsDigit(char c) => c >= '0' && c <= '9';
0 голосов
/ 22 марта 2019

^[0-9]+(-[0-9]+)*$

^[0-9]+ начинается с одного или нескольких чисел

(-[0-9]+)* нуля или одного вхождения тире, за которым следует число с длиной 1 или более

...