我的作业是用C编程语言编写一个表示数值语言的正则表达式。我可以使用l表示字母,d表示数字,a表示+,m表示-,p表示点。假设表达式的任何部分的连续位数都没有限制。
有效数字文字的一些示例是13.,.328,41.16,+45.80,-2.e+7,-.4E-7,01E-06,+0
我想出了:(d+p+a+m)(d+p+E+e+a+m)*
update2:(l+d+p+a+m)(d+p+((E+e)(a+m+d)d*) )*我不确定如何防止像1.0.0.0eee-e1这样的东西。
发布于 2010-10-10 10:14:39
您的正则表达式不支持各种后缀(l、u、f等),也不支持十六进制或八进制常量。
前导符号(数字前面的+或- )在词汇上不是常量的一部分;它们是一元+和-运算符。实际上,所有整型和浮点型常量都是正数。
如果您需要完全支持C99浮点常量,则需要支持十六进制指数(p而不是e)。
您的正则表达式还接受许多无效的字符序列,如1.0.0.0eee-e1。
一个匹配所有C整型和浮点型文字的正则表达式会很长。
发布于 2010-10-10 11:22:53
未经测试,但这至少应该是沿着正确的小数行。(此外,它接受字符串".",或者我认为它无论如何都接受字符串“.”;为了解决这个问题,它将消除integer和FP之间的最后一个公共代码,即前导[0-9]*。)
如果你看到一个缺陷,请不要投反对票。请留下建设性的评论,我会让这个社区维基。
[0-9]*([0-9]([uU](ll?+LL?)+(ll?+LL?)?[uU]?)+(\.[0-9]*)?([eE][+-]?[0-9]+)[fFlL])发布于 2010-10-10 10:50:30
此正则表达式将满足您的所有需求:
[+-]?(?P<Dot1>\.)?\d+(?(Dot1)(?#if_dot_exist_in_the_beginning__do_nothing)|(?#if_dot_not_exist_yet__we_accept_optional_dot_now)(?P<Dot2>\.)?)\d*(?P<Exp>[Ee]?)(?(Exp)[+-]?\d*)https://stackoverflow.com/questions/3898721
复制相似问题