我的作业是编写一个表达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这样的东西。
答案 0 :(得分:3)
您的正则表达式不支持各种后缀(l
,u
,f
等),也不支持十六进制或八进制常量。
数字前面的前导符号(+
或-
)在词法上不是常数的一部分;他们是一元+
和-
运算符。实际上,所有整数和浮点常数都是正的。
如果您需要完全支持C99浮点常量,则需要支持十六进制指数(p
而不是e
)。
您的正则表达式也会接受许多无效的字符序列,例如1.0.0.0eee-e1
。
匹配所有C整数和浮动文字的单个正则表达式会很长。
答案 1 :(得分:1)
未经测试,但这应该至少在十进制的右边。 (另外,它接受字符串“。”,或者我认为它无论如何;修复它将消除整数和FP之间的最后一个公共代码,即前导[0-9]*
。)
如果你看到一个缺陷,请不要downvote。留下建设性的评论,我将建立这个社区维基。
[0-9]*([0-9]([uU](ll?+LL?)+(ll?+LL?)?[uU]?)+(\.[0-9]*)?([eE][+-]?[0-9]+)[fFlL])
答案 2 :(得分:-1)
此正则表达式将满足您的所有需求:
[+-]?(?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*)