我尝试编写正则表达式以匹配以下形式的复数输入: (使用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的新手,所以感谢任何形式的帮助,谢谢!
答案 0 :(得分:0)
正则表达式:^(?:(?<real>\d+(?:(?:\.\d+)?(?:e[+\-]\d+)?)?)?(?:[+\-]))?(?<imaginary>\d+(?:(?:\.\d+)?(?:e[+\-]\d+)?)?)?[iI]$
答案 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]$