[英]c++ Regex for reading Complex Numbers
我正在尝试编写一个正则表达式来匹配以下形式的复数输入:(使用 a,b 实数和 i/I imaginay 单位)
一种
一个+双
阿比
+双
-双
a+i
爱
一世
-一世
当然,在所有数字中,我也希望能够读取指数形式(例如:1.23e+45-67.89e-1256i)。 我想出了这个:
regex aplusbi ("(([\\+-]?[\\d]+([\\.][\\d]+)?)?([eE][\\+-]?[\\d]+)?)?(([\\+-])?(([\\d]+?([\\.][\\d]+)?)?([eE]?[\\+-]?[\\d]+)?)?[iI])?")
它使大多数正确,但是当我输入 +bi 或 -bi 或只是 bi 时,b 部分进入真实的部分,并且它也将这个数字识别为正确的:
12.418.546i
实部为 12.41,虚部为 8.546。 我怎样才能纠正它? 我是 C++ 和正则表达式的新手,所以任何形式的帮助都将不胜感激,谢谢!
由于您喜欢实/虚集群,因此您必须引入 2 个断言
来控制它。
原始: ^(?=[iI.\\d+-])([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?(?![iI.\\d]))?([+-]?(?:(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)?[iI])?$
字符串: "^(?=[iI.\\\\d+-])([+-]?(?:\\\\d+(?:\\\\.\\\\d*)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?(?![iI.\\\\d]))?([+-]?(?:(?:\\\\d+(?:\\\\.\\\\d*)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?)?[iI])?$"
https://regex101.com/r/0JMEZ8/1
可读版本
^
(?= [iI.\d+-] ) # Assertion that keeps it from matching empty string
( # (1 start), Real
[+-]?
(?:
\d+
(?: \. \d* )?
| \. \d+
)
(?: [eE] [+-]? \d+ )?
(?! [iI.\d] ) # Assertion that separates real/imaginary
)? # (1 end)
( # (2 start), Imaginary
[+-]?
(?:
(?:
\d+
(?: \. \d* )?
| \. \d+
)
(?: [eE] [+-]? \d+ )?
)?
[iI]
)? # (2 end)
$
正则表达式: ^(?:(?<real>\\d+(?:(?:\\.\\d+)?(?:e[+\\-]\\d+)?)?)?(?:[+\\-]))?(?<imaginary>\\d+(?:(?:\\.\\d+)?(?:e[+\\-]\\d+)?)?)?[iI]$
所以以上是一个好的开始,但我需要一些改进。 例如,Matlab 在 .csv 文件中以 -0.0232877540359511+-0.00509035792974122i 的形式写出复数,由于前导符号无法读取。 我还想处理指数字符是 E 而不是 e 的情况,并且指数没有符号(默认为正)所以这里是一个小的调整来正确处理这些额外的情况:
^(?:(?<real>[+\-]?\d+(?:(?:\.\d+)?(?:[eE][+\-]?\d+)?)?)?(?:[+\-]))?(?<imaginary>[+\-]?\d+(?:(?:\.\d+)?(?:[eE]?[+\-]\d+)?)?)?[iI]$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.