2010-06-16 81 views
0

我正在寫一段客戶端JavaScript代碼,它需要一個函數並找到它的派生詞,但是,應該匹配的正則表達式權力規則無法在JavaScript程序的上下文中工作,即使它與獨立正則表達式測試程序一起使用時也能成功匹配。JS正則表達式不匹配,甚至認爲它與正則表達式測試儀一起工作

此時的代碼非常簡陋,而且我打算以後再用flesh it out

我正在執行此操作的瀏覽器是Midori,操作系統是Ubuntu 10.04(Lucid Lynx)。這裏的正在使用的HTML頁面,除了代碼接口:

頁:

<html> 
    <head> 
    <title> 
     Derivative Calculator 
    </title> 
    <script type="text/javascript" src="derivative.js"> 
    </script> 
    <body> 
     <form action="" name=form> 
    <input type=text name=f /> with respects to 
    <input type=text name=vr size=7 /> 
    <input type=button value="Derive!" onClick="main(this.form)" /> <br /> 
    <input type=text name=result value="" /> 
     </form> 
    </body> 
</html> 

derivative.js:

function main(form) { 
    form.result.value = derive(form.f.value, form.vr.value); 
} 

function derive(f, v) { 
    var atom = []; 
    atom["sin(" + v + ")"] = "cos(" + v + ")"; 
    atom["cos(" + v + ")"] = "-sin(" + v + ")"; 
    atom["tan(" + v + ")"] = "sec^(2)(" + v + ")"; 
    atom["sec(" + v + ")"] = "sec(" + v + ")*tan(" + v + ")"; 
    atom["1/(cos(" + v + "))"] = "sec(" + v + ")*tan(" + v + ")"; 
    atom["csc(" + v + ")"] = "-csc(" + v + ")*cot(" + v + ")"; 
    atom["1/(sin(" + v + "))"] = "-csc(" + v + ")*cot(" + v + ")"; 
    atom["cot(" + v + ")"] = "-csc^(2)(" + v + ")"; 
    atom["1/(tan(" + v + "))"] = "-csc^(2)(" + v + ")"; 
    atom["sin^(-1)(" + v + ")"] = "1/sqrt(1 - " + v + "^(2))"; 
    atom["arcsin(" + v + ")"] = "1/sqrt(1 - " + v + "^(2))"; 
    atom["cos^(-1)(" + v + ")"] = "-1/sqrt(1 - " + v + "^(2))"; 
    atom["arccos(" + v + ")"] = "-1/sqrt(1 - " + v + "^(2))"; 
    atom["tan^(-1)(" + v + ")"] = "1/(1 + " + v + "^(2))"; 
    atom["arctan(" + v + ")"] = "1/(1 + " + v + "^(2))"; 
    atom["sec^(-1)(" + v + ")"] = "1/(|" + v + "|*sqrt(" + v + "^(2) - 1))"; 
    atom["arcsec(" + v + ")"] = "1/(|" + v + "|*sqrt(" + v + "^(2) - 1))"; 
    atom["csc^(-1)(" + v + ")"] = "-1/(|" + v + "|*sqrt(" + v + "^(2) - 1))"; 
    atom["arccsc(" + v + ")"] = "-1/(|" + v + "|*sqrt(" + v + "^(2) - 1))"; 
    atom["cot^(-1)(" + v + ")"] = "-1/(1 + " + v + "^(2))"; 
    atom["arccot(" + v + ")"] = "-1/(1 + " + v + "^(2))"; 
    atom["ln(" + v + ")"] = "1/(" + v + ")"; 
    atom["e^(" + v + ")"] = "e^(" + v + ")"; 
    atom["ln(|" + v + "|)"] = "1/(" + v + ")"; 
    atom[v] = "1"; 

    var match = ""; 
    if (new Boolean(atom[f]) == true) { 
     return atom[f]; 
    } else if (f.match(/^[0-9]+$/)) { 
     return ""; 
    } else if (f.match(/([\S]+)([\s]+)\+([\s]+)([\S]+)/)) { 
     match = /([\S]+)([\s]+)\+([\s]+)([\S]+)/.exec(f); 
     return derive(match[1], v) + " + " + derive(match[4], v); 
    } else if (f.match(new RegExp("^([0-9]+)(" + v + ")$"))) { 
     match = new RegExp("^([0-9]+)(" + v + ")$").exec(f); 
     return match[1]; 
    } else if (f.match(new RegExp("^([0-9]+)(" + v + ")\^([0-9]+)$"))) { 
     match = new RegExp("^([0-9]+)(" + v + ")\^([0-9]+)$").exec(f); 
     return String((match[1] * (match[3]))) + v + "^" + 
        String(match[3] - 1); 
    } else { 
     return "?"; 
    } 
} 

特別是,我有這個模式的麻煩:

} else if (f.match(new RegExp("^([0-9]+)(" + v + ")\^([0-9]+)$"))) { 
     match = new RegExp("^([0-9]+)(" + v + ")\^([0-9]+)$").exec(f); 
     return String((match[1] * (match[3]))) + v + "^" + 
        String(match[3] - 1); 
+0

請特別說明您遇到麻煩的字符串和模式。它看起來像你有很多,我不願意通過並修復整個程序,但我可以輕鬆地幫助你一個字符串。 – 2010-06-16 16:14:19

+0

我確定了我遇到麻煩的那種模式(應該與動力規則匹配的模式)。但是,由於某些用戶可能不熟悉它是什麼或應該是什麼樣子,我已經進一步澄清。 – 2010-06-16 18:28:41

+0

編輯:其實,有一個小的數學錯誤,所以我很抱歉我造成的任何困惑。 – 2010-06-16 18:43:47

回答

2

您需要雙擊逃避你插入符:

")\\^([0-9]+)$" 

否則,javascript不會將反斜槓解釋爲反斜槓,因此永遠不會脫離正則表達式的插入符號。