我正在寻找一种方法(算法/开源项目/ ???)来模式匹配令牌,方法是构造一个类似于正则表达式的模式或使用类似的主体。
我会试着通过例子描述我的问题。假设我有以下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 );
所以我可以很容易地制作一个理论正则表达式模式,它可以匹配这些语句的所有标记变体,但我怎么能真正做到呢?
为什么我实际上不使用正则表达式?因为我已经在流中已经解析了令牌,看起来应该有一个解决方案。我发誓我以前见过类似的东西。
答案 0 :(得分:1)
不要使用正则表达式。
您尝试做的是lexical analysis,更适合此工作的工具是词法分析器或词法分析器。
如果Python是您的事,我已经使用PLY并取得了成功。他们也可以samples scripts使用,您可以参考。如果没有,大多数现代语言都有可用于词法分析的库或模块。