javascript正则表达式 - 在最后一个标记处拆分字符串

时间:2014-05-13 07:31:31

标签: javascript regex

我正在尝试为java脚本中的表达式输入提供自动完成功能。

这些是相关的令牌

+ - * / [ ] [[ ]] ( ) ! != == . .* .^ ./ < > <= >= : ,

我正在尝试将最后一个标记出现时的字符串拆分为lhs,rhs和token

例如

sum(            ->  `lhs=sum, token=(, rhs=`

sum(x           ->  `lhs=sum, token=(, rhs=x`

sum(x)          ->  `lhs=sum(x, token=), rhs=`

sum(x) + sum(y  ->  `lhs=sum(x) + sum token=(, rhs=y`

[[1,2]],[[      ->  `lhs=[[1,2]], token=[[, rhs=`

[[1,2]],[ [     ->  `lhs=[[1,2]], token=[ [, rhs=`

[[1,2]],[[i     ->  `lhs=[[1,2]], token=[[, rhs=i`

[[1,2]],[[i:    ->  `lhs=[[1,2]],[[i token=:, rhs=`

1 + 2 / A[1     ->  `lhs=1 + 2 / A, token=[, rhs=1`

我目前正在做Math.max(term.lastIndexOf(","),term.lastIndexOf("(") ... )这是效率低下的,并且当它超过后者的时候不提供令牌。另外,如果某个令牌中有一个空格(这是合法的 - 例如[ [),它就无法捕获它。

我知道正则表达式专家对解析器情有独钟,所以我会很感激这一点。

1 个答案:

答案 0 :(得分:1)

为每个令牌编写表达式并将其替换为捕获组。逃避所需的东西。把最长的那个放在第一位。

然后你可以匹配或拆分字符串。例如:

var re = /(\+|-|\*|\/|\[\[|\]\]|\[|\]|\(|\)|!=|!|==|\.\*|\.^|\.|\.\/|<=|>=|<|>|\:|\,)/;
var m = str.split(re);
if(m){
    var rhs = m.pop();
    var token = m.pop();
    var lhs = m.join("");
}

如果要允许[[之间的可选空格,请相应地更改\[\[表达式(取决于空格的含义)。例如\[\s*\[