Это ошибка в Dotnet Regex-Parser? - PullRequest
1 голос
/ 20 июля 2009

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

    private static readonly String validFormuar =  @"^[\d\+-\*\/]+$";
    private static bool IsValidFormular(String value)
    {
        return Regex.IsMatch(value, validFormuar);
    }

Я позволю только цифры, +, -, * и / в этом примере.
Поскольку +, * и / являются специальными символами в регулярных выражениях, я избежал их.
Однако этот код генерирует ArgumentException (перевод с немецкого)

"^[\d\+-\*\/]+$" is beeing analyzed - [x-y]-area in reversed Order.

Если я дважды убегу *

    private static readonly String validFormuar =  @"^[\d\+-\\*\/]+$";

результат, как и ожидалось.
Это ошибка в синтаксическом анализаторе System.Text.RegularExpressions? Потому что я считаю свое первое регулярное выражение правильным. Если нет, почему я должен дважды убежать от «*»?

Ответы [ 3 ]

6 голосов
/ 20 июля 2009

Я думаю, вы найдете, что "-" также является специальным символом в регулярных выражениях (по крайней мере, в пределах "[]" битов). Он задает диапазон символов, например, значение "[0-9]" и значение "0123456789".

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

  • + следует после * (ошибка в диапазоне).
  • + предшествует \ (нет ошибки в диапазоне).

Для пояснения, ваше второе регулярное выражение (@"^[\d\+-\\*\/]+$") фактически означает:

  • "\d"; или
  • "\+" thru "\\" (довольно большой диапазон, включая цифры и заглавные буквы); или
  • "*"; или
  • "\/"

Хотя он компилируется, это не то, что вы хотите (из-за этой второй точки). Я бы попробовал это вместо этого:

@"^[\d\+\-\*\/]+$"
4 голосов
/ 20 июля 2009

С @ "" строками вам не нужно дважды убегать. В вашем примере вы также забыли экранировать "-". Таким образом, правильным будет:

@"^[\d\+\-\*\/]+$"

С другой стороны, когда вы находитесь внутри [], вам не нужно избегать этих (только "-"):

@"^[\d+\-*/]+$"
2 голосов
/ 20 июля 2009

Включите - в качестве первого символа в вашем выражении. В противном случае парсер ищет диапазон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...