首页 > 解决方案 > 用于读取复数的 c++ 正则表达式

问题描述

我正在尝试编写一个正则表达式来匹配以下形式的复数输入:(使用 a、b 实数和 i/I 想象单位)

一种

a+bi

阿比

+bi

-双

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++ 和正则表达式的新手,所以任何形式的帮助都将不胜感激,谢谢!

标签: c++regex

解决方案


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

推荐阅读