Javascript 有没有一种简单的方法可以在没有完整lexer的情况下标记字符串?

Javascript 有没有一种简单的方法可以在没有完整lexer的情况下标记字符串?,javascript,computer-science,tokenize,lexer,shunting-yard,Javascript,Computer Science,Tokenize,Lexer,Shunting Yard,我正在寻找实现,但我需要一些帮助,找出将字符串拆分为其标记的最佳方法是什么 如果您注意到,算法的第一步是“读取令牌”。这并不是一件非常简单的事情。令牌可以由数字、运算符和参数组成 如果您正在执行以下操作: (5+1) 一个简单的string.split()将给我一个标记数组{“(”,“5”,“+”,“1”,“”)} 但是,如果您有多个数字的数字,例如: ((2048*124)+42) 现在,一个简单的string.split()不会起作用。多位数字是个问题 我知道我可以写一个lexer,但是有没

我正在寻找实现,但我需要一些帮助,找出将字符串拆分为其标记的最佳方法是什么

如果您注意到,算法的第一步是“读取令牌”。这并不是一件非常简单的事情。令牌可以由数字、运算符和参数组成

如果您正在执行以下操作:

(5+1)

一个简单的string.split()将给我一个标记数组{“(”,“5”,“+”,“1”,“”)}

但是,如果您有多个数字的数字,例如:

((2048*124)+42)

现在,一个简单的string.split()不会起作用。多位数字是个问题

我知道我可以写一个lexer,但是有没有一种方法可以不用写一个完整的lexer就可以做到这一点呢

我正在用JavaScript实现这一点,如果可能的话,我希望避免使用lexer。
我将使用“*”、“+”、“-”和“/”运算符以及整数。

正则表达式如何?您可以很容易地编写regex来按您想要的方式拆分它,JS string.split方法也接受regex作为参数

例如。。。(修改以包括您需要的所有字符等)


您可以使用全局匹配,如中所述

基本上,创建一个描述令牌的正则表达式

/[0-9]+|false|true|\(|\)/g
将“g”放在末尾,这样它就可以全局匹配,然后调用它的匹配方法

var tokens = myRegex.match(inputString);

然后返回一个数组。

+1嵌套的括号(如
'((42+7)*4)
会中断,但可以通过在表达式的后半部分添加括号来解决:
/([0-9]+|[*+-\/()])/
他仍在使用wiki页面上指定的算法。伪代码是“读取令牌”。@Simucal、@KingNestor我现在很困惑,这不是正确的答案吗?有些人在遇到问题时会认为“我知道,我会使用正则表达式。”现在他们有两个问题@布莱恩佩里斯,我不是说这不是答案。我只是在评论Jani回答的第一行,“如果你不想写wiki上指定的算法。”算法没有指定如何读取令牌,它只是说“读取令牌”。所以,金内斯特就是用这个答案来遵循这个算法的。任何能正确地将字符流转换成令牌流的东西都是lexer。我认为这是最好的方法。我使用result=subject.match(/(?[0-9]+|[*+-\/()])/g);您可以获得所需的代币和所需的代币:)。
var tokens = myRegex.match(inputString);