我正在为实数写一个正则表达式,为什么它会看到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
复制相似问题