0

!すべての文字列をラップされた関数に置き換えて、正規表現を使用してこれを行うにはどうすればよいですか?

例:

  • 3!=>fact(3)

  • 2.321!=>fact(2.321)

  • (3.2+1)!=>fact(3.2+1)

  • (sqrt(2)+2/2^2)!=>fact(sqrt(2)+2/2^2)

4

5 に答える 5

1

あなたの例を考えると、正規表現はまったく必要ありません。

var s = "3!"; //for example

if (s[s.length-1] === "!")
    s = "fact(" + s.substr(0, s.length-1) + ")";

最後のケースで括弧を2倍にしない場合は、別のテストが必要です。

var s = "(sqrt(2)+2/2^2)!"; //for example

if (s[s.length-1] === "!") {
    if(s.length > 1 && s[0] === "(" && s[s.length-2] === ")") 
        s = "fact" + s.substr(0, s.length-1);
    else
        s = "fact(" + s.substr(0, s.length-1) + ")";
}
于 2013-03-19T13:59:09.893 に答える
0

これは、opが要求したとおりです。正規表現の使用:

"3*(2+1)!".replace(/([1-9\.\(\)\*\+\^\-]+)/igm,"fact($1)");

二重括弧で終わる可能性があります:

"(2+1)!".replace(/([1-9\.\(\)\*\+\^\-]+)/igm,"fact($1)");
于 2013-03-19T14:10:39.793 に答える
0
var testArr =  [];
testArr.push("3!");
testArr.push("2.321!");
testArr.push("(3.2+1)!");
testArr.push("(sqrt(2)+2/2^2)!");

//Have some fun with the name. Why not?
function ohIsThatAFact(str) {
    if (str.slice(-1)==="!") {
         str = str.replace("!","");
         if(str[0]==="(" && str.slice(-1)===")") 
             str = "fact"+str;
         else 
             str = "fact("+str+")";
    }
    return str;
}

for (var i = 0; i < testArr.length; i++) {
    var testCase = ohIsThatAFact(testArr[i]);
    document.write(testCase + "<br />");
}

フィドルの例

于 2013-03-19T13:59:20.393 に答える
0
"(sqrt(2)+2/2^2)!".replace(/(.*)!/g, "fact($1)");

それをいじる!

(.*)!

  • 以下の正規表現に一致し、その一致を後方参照番号1にキャプチャします(.*)

    • 改行文字ではない任意の1文字に一致します.
    • ゼロから無制限の時間の間、可能な限り多く、必要に応じて還元する(貪欲)*
  • 文字「!」に一致します 文字通り!
于 2013-03-19T14:00:00.207 に答える
0

私が見つけた私自身の答えは次のとおりです。

Number.prototype.fact = function(n) {return fact(this,2)}
str = str.replace(/[\d|\d.\d]+/g, function(n) {return "(" + n + ")"}).replace(/\!/g, ".fact()")

しかし、私は他の答えがはるかに良いかもしれないかどうかを確認します、彼らはそうだと思います

于 2013-03-19T14:02:11.307 に答える