需要帮助(希望)简单的RegEx

时间:2009-11-18 18:34:31

标签: c# regex winforms

我是使用RegEx的新手,需要一点启动才能让球滚动。我希望RegEx非常简单。

所需要做的就是验证输入的文本是否遵循以下格式:

00.000(2位数,一个句号,3位数)。

对RegEx本身以及如何实施的任何建议将不胜感激!

编辑:感谢大家的所有建议!一切都很好......

6 个答案:

答案 0 :(得分:7)

我认为这是您正在寻找的模式:

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

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

答案 1 :(得分:3)

尝试:

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

同样:

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

如果在某些时候,你想引入至少1位数的说法,但在小数点前接受2,你也可以在花括号内指定下限和上限:

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

例如匹配1.273,但也匹配17.920

答案 2 :(得分:2)

\d{2}\.\d{3}
一个简短的解释:
\d将匹配任何数字字符,大括号表示必须匹配的次数 因此,\d{2}表示彼此相差2位数 正则表达式中的一个点表示“匹配除新行之外的任何字符”(除非您添加了一个也将与换行符匹配的特殊标志),因此要匹配实际的点字符,我们必须通过预先设置反斜杠来转义点运算符。 \.
以及对申请的建议:RegExr

答案 3 :(得分:1)

另一个版本:

\ d {2}。\ d {3}

另一个允许最少1-2位和1-3位小数的版本:

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

答案 4 :(得分:0)

(?< firstPart> \ d {2})\。(?< lastPart> \ d {3})应该这样做,然后如果您愿意,您可以询问群组[“firstPart”]或组[“lastPart”]获取匹配中包含的实际捕获值。希望这可以帮助。汤姆。

答案 5 :(得分:0)

如果你想实现它,最终的状态机就可以了。例如:

#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)等等。