[英]c++ Regex for reading Complex Numbers
我正在嘗試編寫一個正則表達式來匹配以下形式的復數輸入:(使用 a,b 實數和 i/I imaginay 單位)
一種
一個+雙
阿比
+雙
-雙
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)
$
正則表達式: ^(?:(?<real>\\d+(?:(?:\\.\\d+)?(?:e[+\\-]\\d+)?)?)?(?:[+\\-]))?(?<imaginary>\\d+(?:(?:\\.\\d+)?(?:e[+\\-]\\d+)?)?)?[iI]$
所以以上是一個好的開始,但我需要一些改進。 例如,Matlab 在 .csv 文件中以 -0.0232877540359511+-0.00509035792974122i 的形式寫出復數,由於前導符號無法讀取。 我還想處理指數字符是 E 而不是 e 的情況,並且指數沒有符號(默認為正)所以這里是一個小的調整來正確處理這些額外的情況:
^(?:(?<real>[+\-]?\d+(?:(?:\.\d+)?(?:[eE][+\-]?\d+)?)?)?(?:[+\-]))?(?<imaginary>[+\-]?\d+(?:(?:\.\d+)?(?:[eE]?[+\-]\d+)?)?)?[iI]$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.