regex - 如何匹配子字符串和字符串本身?
问题描述
我正在尝试用 lex 标记一堆代码,并用不同的正则表达式匹配不同类型的关键字。当遵循正则表达式匹配时,它会标记与“VARIABLE”匹配的任何内容;
[_a-zA-Z][_a-zA-Z0-9]*
并与 print 语句匹配;
\s*print\((.*?)\)\s*
我需要的是当下面的语句经过词法分析时;
myVar_12
print(myVar_12)
代币应该是这样的;
VARIABLE
PRINT VARIABLE
但我得到的是;
VARIABLE
PRINT
我像昨天一样开始学习正则表达式,不知道该怎么办。所以请原谅我无意义的正则表达式。
解决方案
您已在评论中阐明您想print
成为关键字,无论它是否后跟参数列表。因此,参数列表不应该是print
' regex¹ 的一部分。要匹配的正则表达式print
应该只是print
.
print return PRINT;
[_a-zA-Z][_a-zA-Z0-9]* return VARIABLE;
请注意,顺序很重要,因为输入“print”可以由两个正则表达式匹配,如果多个正则表达式产生相同长度的匹配,则lex
使用文件中第一个出现的匹配。因此,应始终在标识符规则之前定义关键字。
您还需要将括号识别为它们自己的标记并忽略空格(大概)。
¹事实上,无论哪种方式,它都应该是正则表达式的一部分。但是,如果您想print
成为上下文关键字,则需要一个不同的解决方案。
推荐阅读
- r - 如何将图例添加到 ggplot 加载图?
- c# - redirect_uri_mismatch - 带有谷歌日历 api 的 asp.net-core
- php - ubuntu 上的 Laravel Mysql 设置在运行 php aritsan migrate 时出现错误 [1698]
- python - 试图删除烧瓶中的所有表,RuntimeError: No application found。在视图函数中工作或推送应用程序上下文
- indexing - 如何在“if”函数中将整数转换为索引?
- kotlin - kaptGenerateStubsKotlin,CreateProcess 错误=206
- objective-c - 使用手势在 ARSCNView 中移动 SCNNode
- python - 如何在单个日期创建具有多个起点和终点的条形图?
- python - 如何使用 Selenium 将鼠标悬停在多个元素上并通过 Python 提取文本
- python-3.x - 如何模拟返回用户对象的函数