簡體   English   中英

My Napkin Math Parser上復雜正則表達式的邏輯

[英]Logic on a Complicated Regex on My Napkin Math Parser

因此,我正在編寫自己的餐巾紙數學解析器[1],很有趣。 餐巾紙數學是我正在構建的自定義文本編輯器的一部分-當您在等號后按空格時,它將檢測等號之前的方程式並為您執行數學運算。 例如,您鍵入1+1= ,它會神奇地為您踢出2 ,因此屏幕上顯示1+1=2

我真的很難讓正則表達式匹配等號之前的方程式。 我的大腦開槍了,我非常需要正則表達式主的幫助。 以下是我的測試字符串,其中突出顯示的部分是我希望正則表達式匹配的部分。

特別是,我很難讓正則表達式與方程式的真正開始相匹配。 如果等式開始之前有數字或單詞,則我當前的正則表達式會被拋出。 我覺得我需要以某種方式從等號后退。 我開始反轉我的字符串字符,這就是我舉起手來尋求幫助的時候。

我的測試字符串具有所需的matches (字符串的真方程部分):


測試文字(1) pi =

測試文字(1 pi =

測試文字1) pi =

測試文字(2) pi + 10 / 20 =

測試文字(3)測試pi ^ 10 / 20 =

測試文字(30) 10 + 5 =

測試文字(500) abs(10 + 5) =

測試文字(1) pi + 10 / 20 =

測試文字10*5 =

測試文字pi / phi =

測試文本10 mod phi =

測試文本50 10 mod phi =

測試文字pi mod abs(phi) =

蘋果香蕉櫻桃蘋果10蘋果櫻桃香蕉嗨10 99+1 =


這是我在餐巾紙數學中允許使用的所有特殊關鍵詞:

var napkinMathKeyWords = [
    'pi',
    '\\u03C0',
    '\\u03A0',
    'phi',
    '\\u03C6',
    '\\u03A6',
    'abs',
    'acos',
    'cos',
    'atan',
    'tan',
    'asin',
    'sin',
    'ceil',
    'floor',
    'sqrt',
    'log',
    'ln',
    'mod',
];

編輯

這是到目前為止我得到的正則表達式:

(\d|pi|\\u03C0|\\u03A0|phi|\\u03C6|\\u03A6|abs|acos|cos|atan|tan|asin|sin|ceil|floor|sqrt|log|ln|mod).*?=

我的大多數案件都受到打擊,只有幾個案件被拋棄:

http://i.imgur.com/QbueeFC.png


[1] http://blogs.msdn.com/b/onenotetips/archive/2008/05/09/napkin-math-in-onenote.aspx

正如您所暗示的,此正則表達式有點混亂。 但是我有一個可行的方法 (請參閱regex101 )。 在regex101上,我使用了PCRE模式,但只有這樣,我才可以使用“ extended”選項使regex更具可讀性。 在JavaScript中,只需折疊所有換行符和空格即可。

我意識到您的關鍵字列表包含兩個不同的組:

  1. 函數關鍵字,后跟括號中的操作

    var regex_function = "(abs|acos|cos|atan|tan|asin|sin|ceil|floor|sqrt|log|ln)\\([^)]+ )”;

  2. 常量關鍵字(獨立)

    var regex_constant = "(\\d+|pi|\\\π|\\\Π|phi|\\\φ|\\\Φ)";

然后,上述各部分的組合(替換)表示一個操作數:

var regex_operand = "(" + regex_constant + "|" + regex_function + ")";

每個操作數之間必須有一個運算符:

var regex_operator = "([+\\-*\\/^]|mod)";

整個正則表達式可以像這樣放在一起:

var regex = new RegExp(regex_operand + "(\\s*" + regex_operator + "\\s*" + regex_operand + ")*\\s*=");

基本上,您有一個操作數,后跟任意數量的運算符/操作數對,然后是等號。

在我看來,您最好的選擇是斷言某些操作符必須始終跟隨空格。 例如,“ 5 5 =“無效,而“ 5 + 5 =”和“ 5 =“有效”。 因此,我想說您的正則表達式應如下所示:

([numbers and special names like pi][ ]?[operators][ ]?)*[numbers and special names like pi][ ]?\=[ ]?

我可能寫錯了空格,我的意思是說它們最多只能出現一次。 方括號中的其他內容只是大或聲明。 如果我有機會編輯一下括號以正確處理括號,括號可能會變得很棘手。

暫無
暫無

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

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