Нужна помощь с (надеюсь) простым RegEx - PullRequest
0 голосов
/ 18 ноября 2009

Я новичок в использовании RegEx и мне нужно немного начать, чтобы начать игру. Надеюсь, мне нужен RegEx довольно просто.

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

00.000 (2 цифры, точка, 3 цифры).

Буду очень признателен за любые советы по поводу самого RegEx и его реализации!

РЕДАКТИРОВАТЬ: Спасибо за все предложения, все! Все хорошо ...

Ответы [ 6 ]

7 голосов
/ 18 ноября 2009

Я думаю, что это шаблон, который вы ищете:

\d\d\.\d\d\d

или

\d{2}\.\d{3}
3 голосов
/ 18 ноября 2009

Попробуйте:

\d\d\.\d\d\d

Не менее:

\d{2}\.\d{3}

И если в какой-то момент вы хотите ввести как минимум 1 цифру, но примите 2 перед десятичной точкой, вы можете указать нижнюю и верхнюю границу внутри фигурных скобок:

\d{1,2}\.\d{3}

Будет соответствовать 1.273, но также, например, 17.920.

2 голосов
/ 18 ноября 2009

\d{2}\.\d{3}
Краткое объяснение:
\d будет соответствовать любому цифровому символу, а фигурные скобки указывают, сколько раз оно должно совпадать.
Итак, \d{2} означает 2 цифры сразу друг за другом.
Точка в выражении регулярного выражения означает «соответствовать любому символу, кроме новой строки» (если вы не добавили специальный флаг, который также будет соответствовать символу новой строки), поэтому для соответствия действительному символу точки мы должны экранировать оператор точки, добавив обратную косую черту , \.
И рекомендация для заявки: RegExr

1 голос
/ 18 ноября 2009

Другая версия:

\ d {2}. \ Д {3}

Другая версия, которая будет содержать как минимум 1-2 цифры и 1-3 десятичных знака:

\ д {1,2}. \ Д {1,3}

0 голосов
/ 18 ноября 2009

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

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define FSM
#define STATE(x)      s_##x :
#define NEXTSTATE(x)  goto s_##x

int test_input(const char *str) {
  if (strlen(str) != 6)
    return 1;

  FSM {
    STATE(q0) { /* first digit */
      if (isdigit(*str++)) NEXTSTATE(q1);
      else return 1;
    }

    STATE(q1) { /* second digit */
      if (isdigit(*str++)) NEXTSTATE(q2);
      else return 1;
    }

    STATE(q2) { /* dot */
      if (*str++ == '.') NEXTSTATE(q3);
      else return 1;
    }

    STATE(q3) { /* third digit */
      if (isdigit(*str++)) NEXTSTATE(q4);
      else return 1;
    }

    STATE(q4) { /* fourth digit */
      if (isdigit(*str++)) NEXTSTATE(q5);
      else return 1;
    }

    STATE(q5) { /* fifth digit */
      if (isdigit(*str)) return 0;
      else return 1;
    }
  }

  return 0;
}

int main(void) {
  char *input1 = "38.901";
  char *input2 = "38,901";
  int retval = test_input(input1);
  printf("%s\n", (retval)?"fail": "ok");
  retval = test_input(input2);
  printf("%s\n", (retval)?"fail": "ok");
  return 0;
}

Существует формальная теория для преобразования регулярных выражений в конечные автоматы, но я думаю, что это будет слишком сложно для вас. Если вы анализируете более сложный ввод и если вы делаете это часто, вы должны изучить форму EBNF и некоторый генератор парсера, такой как Bison (C, C ++), Parsec или Happy (Haskell) и т. Д.

0 голосов
/ 18 ноября 2009

(? \ d {2}) \. (? \ d {3}) Если вы захотите, то при желании вы можете опросить группы ["firstPart"] или группы [ «lastPart»], чтобы получить фактическое захваченное значение, содержащееся в совпадении. Надеюсь это поможет. Том.

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