Регулярное выражение для соответствия номеру или конкретной строке (то есть "все") - PullRequest
0 голосов
/ 19 марта 2010

Звучит просто, но мои знания о регулярных выражениях ограничены.

Мне нужно выражение, соответствующее десятичному числу или строке «all», как в валидаторе диапазона, который позволяет слову all представлять максимальный диапазон.

Я думал, что-то вроде этого может работать:

((^[-+]?\d*\.?\d*)|any)

Но вышесказанное не работает для "любого".

Ответы [ 3 ]

2 голосов
/ 19 марта 2010

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

private static bool IsNumberOrGivenString(string number, string text, CultureInfo culture)
{
    double result;
    if (double.TryParse(number, NumberStyles.Float, culture, out result))
    {
        return true;
    }

    return number.Equals(text, StringComparison.OrdinalIgnoreCase);
}

private static bool IsNumberOrGivenString(string number, string text)
{
    return IsNumberOrGivenString(number, text, CultureInfo.InvariantCulture);
}

Пример использования:

Console.WriteLine(IsNumberOrGivenString("898", "all")); // true
Console.WriteLine(IsNumberOrGivenString("all", "all")); // true
Console.WriteLine(IsNumberOrGivenString("whatever", "all")); // false
Console.WriteLine(IsNumberOrGivenString("898,0", "all", CultureInfo.GetCultureInfo("sv-SE"))); // true
Console.WriteLine(IsNumberOrGivenString("898,0", "all", CultureInfo.GetCultureInfo("en-US"))); // false

Недостатки этого кода по сравнению с использованием регулярного выражения в том, что он (может) работать локально, используя любой десятичный знак, который используется. Он также потерпит неудачу при наборе числа, скажем, ., если этот символ не является допустимым десятичным разделителем.

Поскольку при сравнении строк игнорируется регистр, оно также будет соответствовать слову «all» независимо от того, является ли оно «all», «All», «aLl» или любым другим сочетанием прописных и строчных букв.

1 голос
/ 19 марта 2010

С | механизм регулярных выражений, вероятно, проверит каждую возможность по очереди и немедленно вернется, если совпадение найдено.

С подвыражения

(^[-+]?\d*\.?\d*)

соответствует пустой строке, LHS | всегда будет успешным, поэтому часть any всегда будет игнорироваться.

Вы должны сделать эту часть не совпадающей с пустой строкой, например

(^[-+]?(?:\d+\.?\d*|\.\d+))
1 голос
/ 19 марта 2010

попробуйте

(((-|\+)?\d+\.?\d*)|any)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...