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