我如何模拟匹配令牌类似于正则表达式?

时间:2014-08-13 23:01:08

标签: regex algorithm language-agnostic

我正在寻找一种方法(算法/开源项目/ ???)来模式匹配令牌,方法是构造一个类似于正则表达式的模式或使用类似的主体。

我会试着通过例子描述我的问题。假设我有以下SQL INSERT语句:

INSERT INTO [dbo].[Table] (Column1) VALUES (@Column1);

我们还说我能够将SQL解析为令牌(我可以),它们看起来像这样:

+-------------------+-------+
| INSERT            | token |
| INTO              | token |
| QUOTEDIDENTIFIER  | token |
| DOT               | token |
| QUOTEDIDENTIFIER  | token |
| LEFTPARENTHESIS   | token |
| IDENTIFIER        | token |
| RIGHTPARENTHESIS  | token |
| VALUES            | token |
| LEFTPARENTHESIS   | token |
| VARIABLE          | token |
| RIGHTPARENTHESIS  | token |
| SEMICOLON         | token |
+-------------------+-------+

假设我有一个令牌流,我想匹配任何INSERT语句(这是一个唯一有效的语法)我会写一个像这样的理论正则表达式模式:

INSERT\s+INTO\s+
QUOTEDIDENTIFIER\s*DOT\s*QUOTEDIDENTIFIER\s*LEFTPAR\s*IDENTIFIER\s*RIGHTPAR
\s*VALUES\s*LEFTPAR\s*VARIABLE\s*RIGHTPAR\s*;

但我知道INSERT语句可以有各种形式,如:

INSERT INTO Table (  Column1) VALUES (@Column1  )
INSERT INTO Table (Column1, Column2) VALUES (@Column1, @Column2  );
INSERT INTO [dbo].[Table] (Column1, Column2) VALUES (@Column1, @Column2  );

所以我可以很容易地制作一个理论正则表达式模式,它可以匹配这些语句的所有标记变体,但我怎么能真正做到呢?

为什么我实际上不使用正则表达式?因为我已经在流中已经解析了令牌,看起来应该有一个解决方案。我发誓我以前见过类似的东西。

1 个答案:

答案 0 :(得分:1)

不要使用正则表达式。

您尝试做的是lexical analysis,更适合此工作的工具是词法分析器或词法分析器。

如果Python是您的事,我已经使用PLY并取得了成功。他们也可以samples scripts使用,您可以参考。如果没有,大多数现代语言都有可用于词法分析的库或模块。