复杂的正则表达式

时间:2014-12-23 12:35:11

标签: c# regex

我需要一些帮助;我正在尝试制作一些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?

这似乎很简单,但我无法完成。请分享您的观点,欢迎任何意见。

1 个答案:

答案 0 :(得分:2)

\b(?=...)都是零长度匹配。换句话说,他们没有捕获任何东西,他们只是声明一个条件,如果不满足条件,则正则表达式失败。

我不确定你用“随机词”究竟是什么意思,但是在C#中看起来像变量一样我会这样做:

\b[a-zA-Z_]\w*\b

这匹配字边界,然后是字母或下划线,后跟0或更多字母/下划线/数字,以字边界结束。

评论后的小更新:这不会产生非ASCII字符的问题,也不会与其他TokenDefiner处理过的int不匹配。

\b(?!int)[a-zA-Z_][a-zA-Z0-9_]*\b