匹配java double值的正则表达式

最近看到Java高手老紫竹写的《判断数字是否为double的正则表达式》,我近来也在学正则表达式的应用,所以来发挥发挥。这里用perl脚本写,因为它支持正则表达式比较好。让我们一步一步来解刨double浮点数:

    普通的整数都是合法double型,带上后缀字母d或者D也是double型。比如: 1 +10 -100 100d 987D 因此用正则表达式:

    ^[-+]?/d[dD]$

    来匹配。 double型的变量还能保存实数。比如: 1.0 +12.34 -45.896 -563.887d 甚至 124. .123 -.687 在Java中也都是合法double值。 1)如果小数点前有整数的话,那小数点和小数的出现可以随意; 2)如果小数点前面没有数字的话,默认以0做整数,但小数必须出现。也就是说,只有一个小数点的话,那就是非法的double数。因此,我们要用多选分支来做:

    ^[-+]?(/d+(/./d*)?|/./d+)[dD]?$

    double变量还有一种,用科学计数法。指数部分只能是十进制整数,允许为负数。比如: 1e123 12.546e54d 4335.546E33 -.54e-7D 因此还要在尾部加上指数的匹配。指数没有小数,所以只要匹配整数就可以。

    ^[-+]?(/d+(/./d*)?|/./d+)([eE][-+]?/d+)?[dD]?$

    最后,也是最麻烦的,就是Java中double的取值范围:负数范围:从-1.7976931348623157×10+308到-4.94065645841246544×10-324 正数范围:从4.94065645841246544×10-324到1.7976931348623157×10+308 这也就是说,指数的取值范围在 -324 到 308 之间。如果仅仅是这样,那还好说,关键是前面的小数还这么复杂。为了简化问题,我就把指数的范围在 -323 到 307 之间,对前面的小数没有限制。那首先来匹配 -307 到 307

    [-+]?([012]?/d{1,2}|30[0-7])

    然后另外在匹配 -308到-324

    -3([01]?[4-9]|[012]?[0-3])

    合并起来,就是:

    ^[-+]?(/d+(/./d*)?|/./d+)([eE]([-+]?([012]?/d{1,2}|30[0-7])|-3([01]?[4-9]|[012]?[0-3])))?[dD]?$

用这个正则表达式来编写一个perl脚本:

#!/usr/bin/perlwhile ($line = <STDIN>){chomp($line);if ($line =~ /^[-+]?(/d+(/./d*)?|(/./d+))([eE]([-+]?([012]?/d{1,2}|30[0-7])|-3([01]?[4-9]|[012]?[0-3])))?[dD]?$/){print $line, " is Java double!/n";}else{print $line, " is not Java double/n";}}

测试数据:

+-.ea1..10.1-.-.1+.11e123d-3.543E4456D-45.54879e-323d-777.1234E-3244553.876e3571543e30713.54e15.78d213.e123d1.2.3-.1.1+ee12

输出

+ is not Java double- is not Java double. is not Java doublee is not Java doublea is not Java double1. is Java double!.1 is Java double!0.1 is Java double!-. is not Java double-.1 is Java double!+.1 is Java double!1e123d is Java double!-3.543E4456D is not Java double-45.54879e-323d is Java double!-777.1234E-324 is not Java double4553.876e357 is not Java double1543e307 is Java double!13.54e15.78d is not Java double213.e123d is Java double!1.2.3 is not Java double-.1.1 is not Java double+e is not Java doublee12 is not Java double

版权声明

本人的所有原创文章皆保留版权,请尊重原创作品。redraiment”和主站点上的本文原始地址。

联系方式

我的邮箱,欢迎来信(redraiment@gmail.com)我的Blogger(子清行)我的Google Sites(子清行)我的CSDN博客(梦婷轩)我的百度空间(梦婷轩)

以前我是个爱仰望天空的人,苍蓝的天空总是给我求生的勇气,

匹配java double值的正则表达式

相关文章:

你感兴趣的文章:

标签云: