一、问题:

Error creating node with http://www.zizhujy.com/Content/Images/FunctionGraffiti.png. Unable to fetch: http://www.zizhujy.com/Content/Images/FunctionGraffiti.png --- Reason: Response code 404 (Not Found) --- Fetch details: { "attempt": 3, "method": "GET", "errorCode": "ERR_NON_2XX_3XX_RESPONSE", "responseStatusCode": 404, "responseStatusMessage": "Not Found", "requestHeaders": { "user-agent": "got (https://github.com/sindresorhus/got)", "accept-encoding": "gzip, deflate, br" }, "responseHeaders": { "cache-control": "no-cache", "content-type": "text/html", "x-reason": "MediaRequest" } } ---自己做了个在线图形计算器,在初级版本中,如果需要画一个幂函数,就需要类似如此输入:

y  = pow(x, 2)

今天对其进行了一个小小的升级,使得可以按照惯例,如此输入:

y = x^2

如何做到这点呢?

二、解决方案:

为了快速升级,此次没有对函数语法解析算法进行修改,只是拦截了用户的输入,在进行语法解析前,对输入进行了字符串级别的替换。即将

y = x^2 替换成 y = pow(x, 2)

语法解析算法仍然照旧,只需要识别pow(x, 2)就好了。

假设s为用户的输入,对其进行替换的全部代码(javascript)为:

s = s.replace(/(\w+)\s*\^\s*(\w+)/, "pow($1, $2)");

三、原理:

幂函数的新输入模式为 x^a,表示x的a次方。原语法解析器只识别pow(x, a)这样的模式。于是使用正则表达式将新的模式替换成旧的模式,就是说:

x^a –> pow(x, a)

匹配新模式x^a的正则表达式为:

/(\w+)\s*\^\s*(\w+)/

它被\^分隔成前后两部分。\^是匹配字符^,而前面一部分是幂函数的底,即x;后面一部分是幂,即a。两组括号中括起来的部分,即分别对应$1和$2。\w表示单词字符,它可以是字母、数字、下划线。+号表示这样的字符可以出现一次或多次。\s表示空白字符,以便匹配 x ^ a 这样的输入。用*号表示空白字符可以不出现,或者出现任意次。但是\s*没有被括号括起来,因为在替换成旧模式pow(x, a)时,空白字符并不需要。