c++ - 用于读取复数的 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++ 和正则表达式的新手,所以任何形式的帮助都将不胜感激,谢谢!
解决方案
由于您喜欢真实/虚构的集群,因此您必须引入 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)
$
推荐阅读
- java - java.lang.RuntimeException:无法实例化应用程序 com.projec.App:java.lang.ClassNotFoundException
- odoo - 当我重新加载 po 文件时,如何保留通过 Odoo 界面(由最终用户)添加或修改的翻译?
- java - 我在向左或向右移动桨时遇到了 paint(Graphics g) 方法的问题
- vba - 查找打开的子表单
- c++ - 进程以退出代码 -1073741819 (0xC0000005) 完成,向量为 unique_ptr
- elasticsearch - Elasticsearch NEST fluent DSL Field name .Suffix 导致语法错误
- javascript - 赛普拉斯:使用 inside() 更好地找到孩子吗?
- python - 将城市名称映射到国家 - python?
- doxygen - 如何在 doxygen 生成的树形视图中隐藏函数和变量
- plotly - 具有特定颜色的多曲面图的图例