2016-09-13 53 views
3

我正在构建一种叫做公式构建器的东西。这个想法是,用户必须输入textarea中的公式文本,然后我们将解析字符串值。结果是数组。正则表达式 - 分裂数学表达式

例如,本文将被解析

LADV-(GCNBIZ+UNIN)+(TNW*-1) 

然后生成下面

["LADV", "-", "(", "GCNBIZ", "+", "UNIN", ")", "+", "(", "TNW", "*", "-1", ")"] 

的点的结果是分割由该字符的一个接合的每个字:+*/-(,和这个);但仍然包括分离器本身。

我试图用这个表达式/[-+*/()]/g来分割,但结果不包括分割符字符。还需要将-1作为一个表达式进行检测。

["LADV", "MISC", "", "GCNBIZ", "UNIN", "", "", "TNW", "", "1", ""] 

什么是匹配正则表达式来解决这个问题?

+0

http://stackoverflow.com/a/18089658/967478 – shashwat

回答

1

可以使用match代替split与交替的正则表达式:

var s = 'LADV-(GCNBIZ+UNIN)+(TNW*-1)'; 
 

 
var m = s.match(/(-\d+(?:\.\d+)?|[-+\/*()]|\w+)/g); 
 

 
console.log(m); 
 

 
//=> ["LADV", "-", "(", "GCNBIZ", "+", "UNIN", ")", "+", "(", "TNW", "*", "-1", ")"]

正则表达式破碎:在交替模式

(     # start capture group 
    -    # match a hyphen 
    \d+(?:\.\d+)? # match a number 
    |    # OR 
    [-+\/*()]  # match one of the symbols 
    |    # OR 
    \w+    # match 1 or more word characters 
)     # end capture group 

顺序很重要。

+1

非常感谢,它的工作对我来说真的很有帮助。这一个非常详细。但对不起,我不能接受这个作为接受的答案,因为@ thomas回答第一:-) – nvl

+1

@NovalAgungPrayogo No. anubhava是第一个回答。 –

+2

对不起!我的错误然后,我只是改变了这个接受的答案:-) – nvl

2

var input = 'LADV-(GCNBIZ+UNIN)+(TNW*-1)'; 
 
var match = input.match(/(-?\d+)|([a-z]+)|([-+*()\/])/gmi); 
 
console.log(match);

+0

非常感谢! – nvl