匹配java double值的正则表达式

简介: 最近看到Java高手老紫竹写的《判断数字是否为double的正则表达式》,我近来也在学正则表达式的应用,所以来发挥发挥。这里用perl脚本写,因为它支持正则表达式比较好。让我们一步一步来解刨double浮点数: 普通的整数都是合法double型,带上后缀字母d或者D也是double型。比如: 1 +10 -100 100d 987D 因此用正则表达式: ^[-+]?/d[dD]$ 来匹

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

  1. 普通的整数都是合法double型,带上后缀字母d或者D也是double型。比如: 1 +10 -100 100d 987D 因此用正则表达式:
    ^[-+]?/d[dD]$
    来匹配。
  2. double型的变量还能保存实数。比如: 1.0 +12.34 -45.896 -563.887d 甚至 124. .123 -.687 在Java中也都是合法double值。 1)如果小数点前有整数的话,那小数点和小数的出现可以随意; 2)如果小数点前面没有数字的话,默认以0做整数,但小数必须出现。也就是说,只有一个小数点的话,那就是非法的double数。因此,我们要用多选分支来做:
    ^[-+]?(/d+(/./d*)?|/./d+)[dD]?$
  3. double变量还有一种,用科学计数法。指数部分只能是十进制整数,允许为负数。比如: 1e123 12.546e54d 4335.546E33 -.54e-7D 因此还要在尾部加上指数的匹配。指数没有小数,所以只要匹配整数就可以。
    ^[-+]?(/d+(/./d*)?|/./d+)([eE][-+]?/d+)?[dD]?$
  4. 最后,也是最麻烦的,就是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/perl

while ($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";
	}
}

测试数据:

+
-
.
e
a
1.
.1
0.1
-.
-.1
+.1
1e123d
-3.543E4456D
-45.54879e-323d
-777.1234E-324
4553.876e357
1543e307
13.54e15.78d
213.e123d
1.2.3
-.1.1
+e
e12

输出

+ is not Java double
- is not Java double
. is not Java double
e is not Java double
a is not Java double
1. 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 double
4553.876e357 is not Java double
1543e307 is Java double!
13.54e15.78d is not Java double
213.e123d is Java double!
1.2.3 is not Java double
-.1.1 is not Java double
+e is not Java double
e12 is not Java double

版权声明

本人的所有原创文章皆保留版权,请尊重原创作品。
转载必须包含本声明,保持本文完整,并以超链接形式注明原始作者“redraiment”和主站点上的本文原始地址。

联系方式

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

目录
相关文章
|
8天前
|
监控 Java Python
Java 中的正则表达式
正则表达式是Java中强大的文本处理工具,支持灵活的匹配、搜索、替换和验证功能。本文介绍了正则表达式的语法基础及其在Java中的应用,包括字符串匹配、替换、分割及实际场景中的邮箱验证和电话号码提取等示例。通过这些技术,可以显著提高文本处理的效率和准确性。
41 8
|
13天前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
2月前
|
移动开发 Java Windows
Java 匹配\r 和 \n 的正则表达式如何编写
【10月更文挑战第19天】Java 匹配\r 和 \n 的正则表达式如何编写
122 3
|
4月前
|
Java
【Java基础面试十】、何对Integer和Double类型判断相等?
这篇文章讨论了如何在Java中正确比较`Integer`和`Double`类型的值,指出不能直接使用`==`操作符比较不同类型,而应该将它们转换为相同的基本数据类型(如`double`)后进行比较。
【Java基础面试十】、何对Integer和Double类型判断相等?
|
5月前
|
Java
Java中将保留四位小数的Double转换为String的方法详解
选择合适的方法,可以使代码更加简洁、高效,同时也能满足不同场景下的需求。
80 5
|
5月前
|
Java Perl
Java进阶之正则表达式
【7月更文挑战第17天】正则表达式(RegEx)是一种模式匹配工具,用于在字符串中执行搜索、替换等操作。它由普通字符和特殊元字符组成,后者定义匹配规则。
34 4
|
4月前
|
监控 Java API
|
5月前
|
数据采集 监控 Java
day21:Java零基础 - 正则表达式
【7月更文挑战第21天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
36 1
|
5月前
|
Java
如何在Java中使用正则表达式
如何在Java中使用正则表达式