我是使用RegEx的新手,需要一点启动才能让球滚动。我希望RegEx非常简单。
所需要做的就是验证输入的文本是否遵循以下格式:
00.000(2位数,一个句号,3位数)。
对RegEx本身以及如何实施的任何建议将不胜感激!
编辑:感谢大家的所有建议!一切都很好......答案 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)等等。