我正在尝试为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("(") ... )
这是效率低下的,并且当它超过后者的时候不提供令牌。另外,如果某个令牌中有一个空格(这是合法的 - 例如[ [
),它就无法捕获它。
我知道正则表达式专家对解析器情有独钟,所以我会很感激这一点。
答案 0 :(得分:1)
为每个令牌编写表达式并将其替换为捕获组。逃避所需的东西。把最长的那个放在第一位。
然后你可以匹配或拆分字符串。例如:
var re = /(\+|-|\*|\/|\[\[|\]\]|\[|\]|\(|\)|!=|!|==|\.\*|\.^|\.|\.\/|<=|>=|<|>|\:|\,)/;
var m = str.split(re);
if(m){
var rhs = m.pop();
var token = m.pop();
var lhs = m.join("");
}
如果要允许[[
之间的可选空格,请相应地更改\[\[
表达式(取决于空格的含义)。例如\[\s*\[
。