簡體   English   中英

用於讀取復數的 C++ 正則表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM