"000000000000000000000000000000000" соответствует Regex "^ [1-9] | 0 $"

В .Net4.5, я нахожу, что результат

System.Text.RegularExpressions.Regex.IsMatch(
    "00000000000000000000000000000", "^[1-9]|0$")

истинно.

Результат, который я ожидаю, является ложным. Я не знаю почему. Можете ли вы мне помочь?

Обновление: В начале я проверял регулярное выражение ^-?[1-9]\d*|0$, которое используется для соответствия целому числу, найденному в Интернете, и я обнаружил, что строка с несколькими 0 соответствует регулярному выражению.

Ответы

Ответ 1

Проблема - поведение привязки генератора. По умолчанию (т.е. Без использования группировки) выражение, содержащее генератор переменного тока (|), будет соответствовать либо значению слева от генератора, либо значению справа.

Итак, в вашем выражении вы соответствуете одному из следующих:

  • ^[1-9]
  • 0$

Ваш вызов метода IsMatch возвращает true, потому что второй из этих двух параметров соответствует строке 00000000000000000000000000000.

Чтобы ограничить привязку генератора к определенной части вашего выражения, вам необходимо сгруппировать с помощью круглых скобок, как показано ниже:

^([1-9]|0)$

Объединяя все это, строгое выражение для проверки целых чисел, запрещение начальных нулей и отрицательного нуля, может выглядеть так:

^(-?[1-9][0-9]*|0)$