我正在为实数写一个正则表达式,为什么它会看到E度的符号?
^[-+]?[0-9]*[.,]?([eE][-+][0-9])?[0-9]*$示例:
-12.12
012,123
.123
,512
342.4E-1
--12.12
12发布于 2022-03-18 16:28:43
您的E-matching片段出现在“分数”之前--匹配的片段--它位于错误的位置。这句话必须在结尾处。它应该与编写的3E+1 OK匹配,但这并不是您想要的。
你有:
^[-+]?[0-9]*[.,]?([eE][-+][0-9])?[0-9]*$它应该更像是:
^[-+]?[0-9]*[.,]?[0-9]*([eE][-+]?[0-9]+)?$请注意,我添加了一个+,以便指数必须至少有一个,并且可能有许多位数。我添加了一个?,所以指数符号是可选的。
给定数据文件:
-12.12
012,123
.123
,512
342.4E-1
--12.12
12使用grep -E运行表达式,得到输出:
$ 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来修复:
^[-+]?([0-9]+[,.]?[0-9]*|[,.][0-9]+)([eE][-+]?[0-9]+)?$段([0-9]+[,.]?[0-9]*|[,.][0-9]+)查找:
这至少需要一个数字--它排除了空行(以及像E+12这样的奇数是一个有效的数字)。
当您的RE与字符类中的破折号字符匹配时,您需要小心。一个简单的规则是始终将破折号放在字符类的开头之后--在[或[^之后。另一个安全位置就在字符类末尾的]前面。如果您还需要将] (和[)匹配为字符类的一部分,那么生活将变得更加棘手:
[^][-]它是一个与]、[和-匹配的否定字符类。第9.3.5节POSIX规范(上文链接)第7节涵盖了其中的一些要点。是的,需要相当多的注意。
https://stackoverflow.com/questions/71530143
复制相似问题