稍短的版本正則表達式解析格式錯誤多項式
我使用這個正則表達式:
(^|[yY]\s{0,}\=|\+|\-)\s{0,}([0-9]{0,}\.?[0-9]{0,})\s{0,}(\*{0,1}[xX]{0,1})\s{0,}(\^{0,1})(-?)([0-9]{0,}\.?[0-9]{0,})(\s{0,}|$)?
從方程式這樣的嘗試,並提取所有的元素係數和訂單編號:
y=x+3.3X^-50+ 15x25.5 - 4x^+2x^2 +3*x-2.5+1.1
我想要正則表達式忽略錯誤的4x^
這是缺少它的電源號碼(目前不這樣做)和讓我得到這個最終結果:
((1.0, 1.0), (3.3, -50.0), (15.0, 25.5), (2.0, 2.0), (3.0, -3.5), (1.1, 0.0))
其中第一個座標是係數,第二個是每個元素的順序。目前,如果我分別使用1 & 2和5 & 6來給出係數和順序,那麼'almost'上的正則表達式可以工作。
它只是在錯誤的4x^
加上感覺非常不雅,但我在正則表達式有點小白,我不知道要做什麼改進。
如何提高這個表達式,並修復使4x^
被認爲是「錯誤的」,但4x2
和4x^2
都好?
TL;博士版本
我試圖通過用戶爲了驗證,然後分解成方程一系列元素進入解析多項式方程。方程將以字符串形式呈現。
這裏的用戶是如何要求的格式字符串的例子:
y = 2.0x^2.5 - 3.1x + 5.2
哪裏x
是自變量(不是象徵倍),並y
是因變量。
在現實中,用戶通常做任何下列錯誤:
- 忘記包括
y =
- 添加
*
以係數如y = 2.0*x
- 使用整數,而不是浮動,例如
y = 5x
- 設置順序時缺失
^
例如,y = x3
- 添加或任何刪除空白
然而,對於所有的這些我會說,它仍然很容易理解用戶正在試圖寫。我的意思是顯而易見每個元素的係數和順序是什麼意思。
所以我想要做的是寫一些正則表達式,正確地將輸入的字符串分割成單獨的元素,並且可以得到我通常具有的元素的每個元素的A
(係數)和B
(順序) Ax^B
和A
和B
可以各自是任何實數。
我設計了下面的例子:
y=x+3.3X^-50+ 15x25.5 - 4x^+2x^2 +3*x-2.5+1.1
我相信這涵蓋了所有的我上面列出,除了另外一個直線上升的錯誤4x^+2x^2
潛在的問題是缺少訂單元素4x^
上。
對於此示例,我想要:((1.0, 1.0), (3.3, -50.0), (15.0, 25.5), (2.0, 2.0), (3.0, -3.5), (1.1, 0.0))
其中4x^
已被忽略。
我有些新的正則表達式,但我一直在使用regex101.com創建以下做出了努力:
(^|[yY]\s{0,}\=|\+|\-)\s{0,}([0-9]{0,}\.?[0-9]{0,})\s{0,}(\*{0,1}[xX]{0,1})\s{0,}(\^{0,1})(-?)([0-9]{0,}\.?[0-9]{0,})(\s{0,}|$)?
這似乎近的工作,有以下問題:
- 不不按上面給出的示例
4x^
捕獲缺失的訂單 - 我不確定如何在存在^
時使訂單號的選擇性爲「有條件」,同時當^
不存在但訂單號如y = 4x2
- 極爲感覺在-簡潔/不雅,但作爲沒有經驗的我很努力,看看可以改進
同時請注意,我愉快地忽略與所述相同的順序重複元素的問題沒有被總結,例如我很高興忽略y = x^2 + x^2
不出現爲y = 2x^2
。
謝謝你的幫助。
p.s.程序是用Go編寫的,但我也對Go有點不高興,因此我首先用Python進行原型設計。不知道這是否會對正則表達式產生任何影響(我真的很喜歡正則表達式)。
我會注意到'{0,}'可以是'*','{0,1}'是'?'。 – Uriel
我想你試圖得到的答案是((1.0,1.0),(3.3,-50.0),(15.0,25.5),(2.0,2.0),(3.0,-2.5),(1.1,0.0)) ...注意第五對是(3.0,-2.5)而不是(3.0,-3.5)。對? –