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

C++ c++;用于读取复数的正则表达式,c++,regex,C++,Regex,我正试图编写一个正则表达式来匹配以下形式的复数输入: (带a、b实数和i/i想象单位) a a+B 阿比 +毕 -毕 a+i a-i 我 -我 当然,在所有数字中,我也希望能够阅读指数形式(例如:1.23e+45-67.89e-1256i)。 我想到了这个: regex aplusbi ("(([\\+-]?[\\d]+([\\.][\\d]+)?)?([eE][\\+-]?[\\d]+)?)?(([\\+-])?(([\\d]+?([\\.][\\d]+)?)?([eE]?[\\+-]?

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

a

a+B

阿比

+毕

-毕

a+i

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++和正则表达式有点新,所以任何帮助都会被理解的,谢谢!p> 正则表达式:
^(?:(?\d+(?:(?:\。\d+)(?:e[+\-]\d+)(?:[+\-])?(?\d+(?:(?::\。。。。)(?:e[+\-]\d+)?[iI]$


因为您喜欢真实/虚构的集群,所以必须引入两种断言
控制它

原始:
^(?=[iI.\d+-])([+-](?:\d+)?。\d+([eE][+-]?\d+)(?![iI.\d]))([+-](?:(?:\d+(?:\.\d*)?。\d+([eE][+-]。\d+)([eE][+-]?\d+)?)([iI]),

字符串:
“^(?=[iI.\\d+-])([+-]?(?:\\d+(?:\\\\.\\d*)?\\\.\\d+([eE][+-]?\\d+)(?![iI.\\d])([+-](?:(?:\\d+(?:\\.\\d*)?\\\.\\d+([eE][+-]?\\\\.\\d+)([iI])?),[iI])?”,“

可读版本

 ^ 
 (?= [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)
 $

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

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

关于正则表达式有一种说法,它是这样说的:“我有一个问题。我用正则表达式解决了它。现在我有两个问题。”正则表达式非常强大,但也非常复杂,因此很难使用和完全正确,而且在许多情况下都是多余的。我建议您先尝试一种更简单的解析方法。我已经尝试过了,但我需要处理许多输入方式,但我想不出这一种。尽管如此,我还是会尝试在将来使用其他解析方法,谢谢!您使用的正则表达式引擎是什么?POSIX还是EmcaScript?我不太确定,但我认为EmcaScript。我正在Linux Ubuntu上使用g++编译器,带有默认库,这就是我所能告诉你的一切,非常感谢!我从未见过,我知道它们是名字,但它们是如何工作的?它似乎不捕捉整数,也不捕捉实数
是命名的捕捉组。你可以阅读更多关于它的信息(在这里)[正如你可以在演示链接的匹配信息部分看到的那样(在右侧)在UE C++代码中,可以使用捕获组,通过添加额外的<代码> \/COD> > <代码> >(?)(?):(?\d+(?::(\:\\d+)?(?:[+[-\] d+)?)?(?:[+:-]))(?):\d+(?:(?:\\d++)?(?:e:[+[-] + d+)?)??[I]在回答中,如果你需要捕捉真实的部分和图像$捕获来自的虚数时有一个细微的变化,它允许在加号之前/之后使用空格。我还需要单独捕获I,但其余的基本上与您的答案相同:
(?:(?:)(?:)(?:\。\d+)(?:e[+\-]\d+)(?:\s?[+\-]\s?)(?\d+(?:(?:(?:(?::。。。。。。。。。\d+)(?:e[+\]\d+)([iI])\s*