我需要一些帮助;我正在尝试制作一些Regex
表达式,以便在我的代码中捕获单词int
,任何数学运算,任何数字和=
符号,而忽略所有其余的。将被忽略的单词将设置为false,而其他单词将设置为true,如下面的代码所示。
这将用于对上述关键字进行Tokenize以实现可以检测整数溢出的Lexer。我需要专门用Regex
完成此操作。
我已经成功地捕获了int
这个词,数学运算和数字,但我的Regex
似乎无法识别任何随机词;例如变量名(number1,number2等)和语言中的任何其他单词,例如if语句,圆括号,大括号等......
lexer.AddDefinition(new TokenDefinition(
"(operator)",
new Regex(@"\*|\/|\+|\-"),
false));
lexer.AddDefinition(new TokenDefinition(
"(literal)",
new Regex(@"\d+"),
false));
lexer.AddDefinition(new TokenDefinition(
"(Random Word)",
new Regex(@"(?=.*[A-Z])(?=.*[a-z])"),
false));
lexer.AddDefinition(new TokenDefinition(
"(integer)",
new Regex(@"\bint\b"),
false));
lexer.AddDefinition(new TokenDefinition(
"(white-space)",
new Regex(@"\s+"),
true));
// This is not working. Random words such as variable names are not being captured by this.
lexer.AddDefinition(new TokenDefinition(
"(random-word)",
new Regex(@"\b(?=.*[A-Z])(?=.*[a-z])\b"),
true));
// What about the brackets? How can I implement a Regex to capture brackets?
这似乎很简单,但我无法完成。请分享您的观点,欢迎任何意见。
答案 0 :(得分:2)
\b
和(?=...)
都是零长度匹配。换句话说,他们没有捕获任何东西,他们只是声明一个条件,如果不满足条件,则正则表达式失败。
我不确定你用“随机词”究竟是什么意思,但是在C#中看起来像变量一样我会这样做:
\b[a-zA-Z_]\w*\b
这匹配字边界,然后是字母或下划线,后跟0或更多字母/下划线/数字,以字边界结束。
评论后的小更新:这不会产生非ASCII字符的问题,也不会与其他TokenDefiner处理过的int
不匹配。
\b(?!int)[a-zA-Z_][a-zA-Z0-9_]*\b