簡體   English   中英

用於驗證數學方程的正則表達式

[英]Regular Expression for validating mathematical equation

我需要使用正則表達式在c#中驗證表達式。

要驗證的字符串具有以下規則:

  1. 表達式中只能使用三個變量:[椅子],[桌子],[風扇](請注意,包括方括號。
  2. 只能使用四個數學運算符:+,-,/,*
  3. 可以使用支架(我們需要確保支架放置正確)
  4. 可以使用浮點常量:例如10.55、22.23、3等。

第一個目標是驗證輸入的字符串是否遵循上述規則。

(稍后,我們可能還需要解析和計算值。但是問題基本上是關於驗證正則表達式的。)

我喜歡深奧的正則表達式。 他們讓我感到溫暖和模糊。 但是,我不在項目中使用它們,因為它們通常不屬於生產代碼。 我將給您一個正則表達式,它幾乎可以滿足您的所有要求,然后我將解釋為什么這不是一個好主意。

它基於以下事實:您無法(或至少我無法想到如何)驗證表達式是否正確,但可以使用一個表達式來匹配格式錯誤的表達式。 所以這里是:

(\[[a-z0-9]+\]).*?(?(1)(\[[a-z0-9]+\]).*?)(?(2)(\[[a-z0-9]+\]).*?)(?(3)(\[[a-z0-9]+\]).*?)|[/+*.-]{2,}|[^\[\]0-9a-z/+*.-]|(?>[0-9]+(?:\.[0-9]+)*)[^/+*-]|\[[^\]]+(?:\[|$)|\[[^a-z0-9]*[^a-z0-9\]]

現在再來看一下這種模式……非常好看。 因為一旦將其提交到代碼中,就應對它負責。

問題1-維護

更改規格會怎樣? 假設您要允許(4)個變量或允許布爾運算符。 您究竟將如何改變這種模式? 我保證我第一次嘗試修改它會失敗,而且這還沒有達到它的復雜程度。 不過,您在編寫該書時應該已經看過我破解了多少本。

您可以嘗試在SO上再次發布,也許有人可以解密它。 不過,您必須進行大量測試才能確保所有修訂都是正確的。 這導致...

問題2-測試

您如何調試任何修訂? 這就是為什么我說我不在生產代碼中使用它的原因。 使用過程代碼,您可以設置斷點並使用QuickWatch找出正在發生的事情,但是正則表達式就像黑盒子。 如果此模式中有錯誤,將很難修復它。 即使您完全了解發生了什么,也有幸將這個怪物交給其他開發人員。

我鼓勵您研究上面的表達式,嘗試弄清楚它的工作方式和原因,甚至進行修改。 但是出於您自己和與您一起工作的任何人的理智 ,請不要將此或其中的任何混蛋納入您的項目。 aioobe為您提供了一個開始尋找正確的方法的好地方。 我強烈建議您遵循該路徑。

3.可以使用托架(我們需要確保正確放置托架)

請記住,帶括號的單詞的語言不規則

這意味着,如果您確實確實想為任務使用正則表達式,則必須依賴於正則表達式引擎特定的擴展

基本上,正則表達式不是完成此任務的好工具 您應該看看上下文無關的語法,以及大概可以為C#生成解析器的解析器生成器。

SO的進一步閱讀:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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