zl程序教程

您现在的位置是:首页 >  后端

当前栏目

匹配java double值的正则表达式

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

最近看到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]?$

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"; }

测试数据:

+

1e123d

-3.543E4456D

-45.54879e-323d

-777.1234E-324

4553.876e357

1543e307

13.54e15.78d

213.e123d

1.2.3

-.1.1

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


Java正则表达式匹配aabb、abab格式字符 我们开发过程中,经常用到正则表达式来匹配想要的字符串,或者从一段文本中提取想要的关键字,比如爬虫应用等。正则表达式是对字符串提取的一套规则,我们把这个规则用正则里面的特定语法表达出来,去匹配满足这个规则的字符串。正则表达式具有通用型,不仅java里面可以用,其他的语言也一样适用。
Java正则表达式 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种【文本模式(Pattern)】。 正则表达式使用单个字符串来描述、匹配具有相同规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的核心功能就是处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
java正则表达式进阶 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是 非贪心的 。 非贪心的 模式匹配搜索到的、尽可能短的字符串,而默认的 贪心的 模式匹配搜索到的、尽可能长的字符串。 例如,在字符串 oooo 中, o+? 只匹配单个 o ,而 o+ 匹配所有 o 。
一文学会java正则表达式 1.什么是正则表达式? 在了解正则表达式之前,我们先看几个非常常见的问题: 如何判断字符串是否是有效的电话号码?例如:010-1234567,123ABC456,13510001000等; 如何判断字符串是否是有效的电子邮件地址?例如:test@example.com,test#example等; 如何判断字符串是否是有效的时间?例如:12:34,09:60,99:99等。 一种直观的想法是通过程序判断,这种方法需要为每种用例创建规则,然后用代码实现。 为每一种判断逻辑编写代码实在是太繁琐了。有没有更简单的方法?
Java的正则表达式 这个系列其实没有多少可说的内容了,不过生活总是要继续的,所以一周工作下来,有摸鱼也有忙碌,当然也有一些感慨和思考。
redraiment 阿里巴巴-淘宝-新制造-高级技术专家,PostgreSQL、Clojure、FreeBSD等技术爱好者