簡體   English   中英

javascript中嵌套括號的正則表達式

[英]regex for nested parenthesis in javascript

我正在用Javascript編寫計算器。

我想將[expression1]^[expression2]轉換為: Math.pow([expression1], [expression2])

當我有像5^-3這樣的簡單表達式時,使用正則表達式非常容易,但是當它帶有更復雜的表達式時,例如:

(-5*(6+3)-5)^((2*2)-2)+(4*5)

由於嵌套括號,我看不到如何用正則表達式處理...

有什么建議嗎? 謝謝。

使用正則表達式模式:

/((?:(?=[^()]*\d)\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))\^((?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))/

檢查這個小提琴


說明:

[步驟1] :: Regex模式包含兩個幾乎相同的子模式,兩個子模式之間用^符號鏈接

((?:(?=[^()]*\d)\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))
\^
((?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))

唯一的不同是,第二個(在^后面)允許使用負數作為簡單參數( \\-?

[步驟2] :: 步驟1的子模式有兩種選擇:

(?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)
|
(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\))

[步驟3] ::第一個替代方法是數字-例如: 123412.341234..1234

(?=[^()]*\d)
\-?\d*
(?:\.\d*)?

[步驟4] ::第二種選擇是嵌套括號公式

\(
(?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)
\)

[步驟5] ::可能是簡單的也可能是復雜的(內部帶有其他括號)

(?:[^()]+)
|
(?:[^()]*\([^()]*\)[^()]*)+

[第6步] ::如果復雜並且內部有其他括號,我們確保嵌套

[^()]*
\(
[^()]*
\)
[^()]*

現在的瀏覽器javascript。 不支持遞歸正則表達式。

我對此的解決方案是將前綴與正則表達式匹配。 然后使用標記器方法搜索其括號。 如果括號是平衡的,則返回括號內的塊。

// replace_tokenizer_paranthesis by shimon doodkin
// this function is searching for a regexp prefix
// then searching for a chunk inside balanced parantheseis
//
// s="s( s(gdfgs)fasd)" - searched string
// prefix=/s\(/   - searched regex for prefix
// onmatch: - replace callback function, arguments:
//  a= prefix,
//  b= inside data,
//  c = closing paranthesis
//  to return same , return  [a,b+c]
//
// example:
// replace_tokenizer_paranthesis(s,prefix,function (a,b,c){ return [ "CONVERT(",b+",DATE)"  ] }) // return [ newprefix , all rest ]

function replace_tokenizer_paranthesis(s,prefix,onmatch) 
{
 var m,start=0;
 var input;
 while(m=(input=s.substr(start)).match(prefix))
 {
    var offset_at_end=m.index+m[0].length;


    var counter = 1;

    var skip_until="";
    var i = offset_at_end;
    for(; i < input.length; i++)
    {
        //var pc = i-1>=0?input[i-1]:"";
        var c = input[i];
        if( counter===0 )
        {
            break;
        }

        //else if(c===skip_until&& pc!=='\\') //maybe backslash queoted
        else if(c===skip_until)
        {
            skip_until='';
        }
        else if(c==='"')
        {
            skip_until='"';
        }
        else if(c==="'")
        {
            skip_until="'";
        }

        else if(c==='(')
        {
            counter++;
        }
        else if(c===')')
        {
            counter--;
        }
    }
    if( counter===0 )
    {
            var result=onmatch(m[0], input.substring(offset_at_end,i-1),")")
            s=s.substring(0,start+m.index)+result[0]+result[1]+s.substr(start+i);
            start+=result[0].length;
    }
    else
      start+=offset_at_end;
 }
 return s
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM