оператор switch - проверка подстрок - PullRequest
1 голос
/ 14 сентября 2011

данные поля имеют 4 допустимых типа значений:

 j
 47d (where the first one-two characters are between 0 and 80 and third character is d)
 9u (where the first one-two characters are between 0 and 80 and third character is u)
 3v (where the first character is between 1 and 4 and second character is v).

В противном случае данные следует считать недействительными.

string data = readconsole ();

чтолучший способ проверки этого ввода?

Я рассматривал комбинацию проверок подстроки .Length и Switch.

т.е..

if (data == "j")

else if (data.substring(1) == "v" && data.substring(0,1) >=1 && data.substring(0,1) <=4)
....
else
   writeline("fail");

Ответы [ 3 ]

4 голосов
/ 14 сентября 2011

Вы можете использовать регулярное выражение, которое соответствует различным видам значений:

^(j|(\d|[1-7]\d|80)[du]|[1-4]v)$

Пример:

if (Regex.IsMatch(data, @"^(j|(\d|[1-7]\d|80)[du]|[1-4]v)$")) ...

Объяснение регулярного выражения:

^ matches the beginning of string
j matches the literal value "j"
| is the "or" operator
\d matches one digit
[1-7]\d matches "10" - "79"
80 matches "80"
[du] matches either "d" or "u"
[1-4] matches "1" - "4"
v matches "v"
$ matches the end of the string
2 голосов
/ 14 сентября 2011

A регулярное выражение будет наиболее лаконичным способом проверки таких правил.

1 голос
/ 14 сентября 2011

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

^(?:j|(?:[0-7]?[0-9]|80)[du]|[1-4]v)$

Другой вариант - разделить на цифры и буквы и проверить результаты. Это довольно долго, но, вероятно, легче поддерживать в долгосрочной перспективе:

public bool IsValid(string s)
{
    if (s == "j")
        return true;
    Match m = Regex.Match(s, @"^(\d+)(\p{L})$");
    if (!m.Success)
        return false;
    char c = m.Groups[2].Value[0];
    int number;
    if (!Int32.TryParse(m.Groups[1].Value, NumberStyles.Integer,
        CultureInfo.CurrentCulture, out number)) //todo: choose culture
        return false;
    return ((c == 'u' || c == 'd') && number > 0 && number <= 80) ||
           (c == 'v' && number >= 1 && number <= 4);
}
...