为C数字文字编写正则表达式

时间:2010-10-10 02:11:38

标签: c regex

我的作业是编写一个表达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这样的东西。

3 个答案:

答案 0 :(得分:3)

您的正则表达式不支持各种后缀(luf等),也不支持十六进制或八进制常量。

数字前面的前导符号(+-)在词法上不是常数的一部分;他们是一元+-运算符。实际上,所有整数和浮点常数都是正的。

如果您需要完全支持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*)