JS regex isn't matching, even thought it works with a regex tester

Posted by Tom O on Stack Overflow See other posts from Stack Overflow or by Tom O
Published on 2010-06-16T16:10:54Z Indexed on 2010/06/16 16:12 UTC
Read the original article Hit count: 1126

Filed under:
|
|
|

I'm writing a piece of client-side javascript code that takes a function and finds the derivative of it, however, the regex that's supposed to match with the power rule fails to work in the context of the javascript program, even though it sucessfully matches when it's used with an independent regex tester.

The browser I'm executing this on is Midori, and the operating system is Ubuntu 10.04 (Lucid Lynx). Here's the HTML page being used as the interface in addition to the code:

Page:

<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] - 1))) + v + "^" +
                   String(match[3] - 1);
    } else {
        return "?";
    }
}

© Stack Overflow or respective owner

Related posts about JavaScript

Related posts about regex