繁体   English   中英

用于读取复数的 C++ 正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM