首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么正则表达式看不到E或e格式的指数

为什么正则表达式看不到E或e格式的指数
EN

Stack Overflow用户
提问于 2022-03-18 16:20:20
回答 1查看 54关注 0票数 -1

我正在为实数写一个正则表达式,为什么它会看到E度的符号?

代码语言:javascript
运行
复制
^[-+]?[0-9]*[.,]?([eE][-+][0-9])?[0-9]*$

示例:

代码语言:javascript
运行
复制
-12.12
012,123
.123
,512
342.4E-1
--12.12
12
EN

回答 1

Stack Overflow用户

发布于 2022-03-18 16:28:43

您的E-matching片段出现在“分数”之前--匹配的片段--它位于错误的位置。这句话必须在结尾处。它应该与编写的3E+1 OK匹配,但这并不是您想要的。

你有:

代码语言:javascript
运行
复制
^[-+]?[0-9]*[.,]?([eE][-+][0-9])?[0-9]*$

它应该更像是:

代码语言:javascript
运行
复制
^[-+]?[0-9]*[.,]?[0-9]*([eE][-+]?[0-9]+)?$

请注意,我添加了一个+,以便指数必须至少有一个,并且可能有许多位数。我添加了一个?,所以指数符号是可选的。

给定数据文件:

代码语言:javascript
运行
复制
-12.12
012,123
.123
,512
342.4E-1
--12.12
12

使用grep -E运行表达式,得到输出:

代码语言:javascript
运行
复制
$ grep -nE -e '^[-+]?[0-9]*[.,]?[0-9]*([eE][-+]?[0-9]+)?$' data
1:-12.12
2:012,123
3:.123
4:,512
5:342.4E-1
7:12
$

使用grep -E意味着RE被解释为POSIX扩展正则表达式(ERE)。上面的RE匹配一个空字符串。这可能是不可取的--但是(正如注释中所指出的)可以使用ERE来修复:

代码语言:javascript
运行
复制
^[-+]?([0-9]+[,.]?[0-9]*|[,.][0-9]+)([eE][-+]?[0-9]+)?$

([0-9]+[,.]?[0-9]*|[,.][0-9]+)查找:

  • 一个或多个数字的字符串,可选地后面跟着小数点(逗号或点)和零或多个小数位,
  • 或以小数点开头的字符串,后面跟着一个或多个小数。

这至少需要一个数字--它排除了空行(以及像E+12这样的奇数是一个有效的数字)。

当您的RE与字符类中的破折号字符匹配时,您需要小心。一个简单的规则是始终将破折号放在字符类的开头之后--在[[^之后。另一个安全位置就在字符类末尾的]前面。如果您还需要将] (和[)匹配为字符类的一部分,那么生活将变得更加棘手:

代码语言:javascript
运行
复制
[^][-]

它是一个与][-匹配的否定字符类。第9.3.5节POSIX规范(上文链接)第7节涵盖了其中的一些要点。是的,需要相当多的注意。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71530143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档