JS регулярное выражение не соответствует, даже думал, что это работает с тестером регулярных выражений - PullRequest
0 голосов
/ 16 июня 2010

Я пишу фрагмент кода JavaScript на стороне клиента, который берет функцию и находит ее производную, однако регулярное выражение, которое должно соответствовать правилу мощности, не работает в контексте программы на JavaScript, даже хотя он успешно совпадает, когда используется с независимым тестером регулярных выражений.

Код на данный момент чрезвычайно прост, и я планирую конкретизировать его позже.

Браузер, в котором я запускаю это, - 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);

1 Ответ

2 голосов
/ 16 июня 2010

Вам нужно дважды убежать от каретки:

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

В противном случае javascript не интерпретирует обратную косую черту как обратную косую черту, и поэтому никогда не выходит за пределы символа регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...