匹配java double值的正则表达式

最近看到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博客(梦婷轩
我的百度空间(梦婷轩

时间: 2024-08-20 03:34:12

匹配java double值的正则表达式的相关文章

java-C#中将double值变成二进制然后写入文件,Java中载入该文件读取此二进制double值时不正确

问题描述 C#中将double值变成二进制然后写入文件,Java中载入该文件读取此二进制double值时不正确 目前已定位到是因为C#中的byte范围是0到255,而java中byte值为-128到127导致的错误. 尝试过使用C#的sbyte来解决: bw1 = new BinaryWriter(new FileStream("C:UsersDELLDesktopSpatialIndexctest1.bin", FileMode.Create)); bw2 = new BinaryW

在Java编程中使用正则表达式_java

在程序设计过程中,经常需要对输入的数据格式进行检查,这时就会用到正则表达式,匹配正则表达式则数据格式正确,否则格式错误.为了检查输入的数据是否满足某种格式,可以使用String类的matches()方法进行判断,语法格式如下: boolean matches(String regex) regex:指定的正则表达式. 返回值:返回boolean类型. 该方法用于告知当前字符串是否匹配参数regex指定的正则表达式,返回值是boolean类型,如果当前字符串与正则表达式匹配,则该方法返回true,

请问怎样用java实现一个基于正则表达式的查找程序呢?

问题描述 各位高手,请问怎样用java实现一个基于正则表达式的查找程序呢? 解决方案 解决方案二:可以去看看horstmann写得corejavaVolumI第12章最后一节RegularExpressions:importjava.io.*;importjava.net.*;importjava.util.regex.*;/**ThisprogramdisplaysallURLsinawebpagebymatchingaregularexpressionthatdescribesthe<ahr

java提取字符串的正则表达式

问题描述 java提取字符串的正则表达式 数据格式:{""collectTime"":""2015-11-11 10:08:27""dateTime"":""1447207707612hostName"":""SW-ADMIN-S5750-A0102""instanceId"":""260

对象-java传递 ”值传递和引用传递“还是全部 “值传递”

问题描述 java传递 "值传递和引用传递"还是全部 "值传递" 若说值传递.基本类型是copy的值赋给形参,对象是把 堆中对象的 地址 传给 形参. 若说分为值传递和引用传递..引用传递 是因为这个传的地址,导致实参和形参 操作的都是同一块内存. 有点乱,像文字层次上的撕逼.. 若往引用传递方面思考,C++的指针又把我搅乱了.,java里不能直接管理内存,传递的不是 变量本身 的栈地址.而是变量的内容(值) 解决方案 java没有什么值传递引用传递,都是传递对象引

返回值 异常-想问下java返回值的问题,可能有点白目大家帮帮忙

问题描述 想问下java返回值的问题,可能有点白目大家帮帮忙 private String getBookByName(String[] books){ System.out.println("请输入书名:"); book=input.next(); for(int i=0;i<books.length;i++){ if(book.equals(books[i])){ return books[i]; }else{ return null; } } 之前没写else提示我没返回值

实用正则表达式匹配和替换大全_正则表达式

正则表达式非常有用,查找.匹配.处理字符串.替换和转换字符串,输入输出等.而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式.下面整理一些常用的正则表达式. 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 "

java类的问题-JAVA 实例化值传递的问题

问题描述 JAVA 实例化值传递的问题 我有一个类 character另一个类 UI1 与继承自UI1的子类UI2我在UI1 里实例化了 character c=new character():,并用set方法进行了初始化 但子类 通过父类实例化的 c 进行 get set 都是得不到通过UI1初始化后的值,why? 解决方案 楼主可能把子类父类的概念与接口与实现类的概念搞混了.你用set方法赋值之后只有c实例里面的属性改变了,不会传递到别的地方.在UI2中你再创建一个c,这个c和UI1里的c在

一个java问题 值传递的

问题描述 一个java问题 值传递的 public class test1 { private int i = 0; public test1(int i) { this.i = i; } public static void process(test1 obj) { obj = new test1(99); obj.i --; } public static void main(String[] argv) { test1 o1 = new test1(1); process(o1); Sys