[英]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中,只需折疊所有換行符和空格即可。
我意識到您的關鍵字列表包含兩個不同的組:
函數關鍵字,后跟括號中的操作
var regex_function = "(abs|acos|cos|atan|tan|asin|sin|ceil|floor|sqrt|log|ln)\\([^)]+
)”;
常量關鍵字(獨立)
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.