c ++ Regex用于读取复数

时间:2018-05-19 12:31:06

标签: c++ regex

我尝试编写正则表达式以匹配以下形式的复数输入: (使用a,b实数和i / I imaginay单位)

A +双

一个-BI

+双

-bi

A + I

A-I

-i

当然,在所有数字中我都希望能够读取指数形式(例如:1.23e + 45-67.89e-1256i)。 我想出了这个:

   regex aplusbi ("(([\\+-]?[\\d]+([\\.][\\d]+)?)?([eE][\\+-]?[\\d]+)?)?(([\\+-])?(([\\d]+?([\\.][\\d]+)?)?([eE]?[\\+-]?[\\d]+)?)?[iI])?")

它使得大多数都是正确的,但是当我输入+ bi或-bi或简单地将b部分转换为真实部分时,它也会将此数字识别为正确:

12.418.546i

将12.41变为真实部分,将8.546变为虚拟部分。我怎么能纠正它?我是C ++和regex的新手,所以感谢任何形式的帮助,谢谢!

3 个答案:

答案 0 :(得分:0)

正则表达式:^(?:(?<real>\d+(?:(?:\.\d+)?(?:e[+\-]\d+)?)?)?(?:[+\-]))?(?<imaginary>\d+(?:(?:\.\d+)?(?:e[+\-]\d+)?)?)?[iI]$

Demo

答案 1 :(得分:0)

由于你喜欢真实/虚构的集群,你必须引入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)
 $

答案 2 :(得分:0)

因此,以上是一个好的开始,但是我需要一些改进。例如,Matlab以-0.0232877540359511 + -0.00509035792792974ii的形式在.csv文件中写出复数,由于前导符号而无法读取。我还想处理指数字符是E而不是e且指数没有符号(默认为正)的情况,因此这里有一个小的调整,可以正确处理这些其他情况:

^(?:(?<real>[+\-]?\d+(?:(?:\.\d+)?(?:[eE][+\-]?\d+)?)?)?(?:[+\-]))?(?<imaginary>[+\-]?\d+(?:(?:\.\d+)?(?:[eE]?[+\-]\d+)?)?)?[iI]$