【问题标题】:Complicated Regex复杂的正则表达式
【发布时间】:2015-02-21 14:28:37
【问题描述】:

我在这里需要一些帮助;我正在尝试制作一些Regex 表达式,以便在我的代码中捕捉单词int、任何数学运算、任何数字和= 符号,而忽略所有其他内容。将被忽略的单词将设置为 false,而其他单词将设置为 true,如下面的代码所示。

这将用于标记上述关键字,以实现可以检测整数溢出的 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?

这似乎很简单,但我无法完成。欢迎分享你的看法,欢迎提出意见。

【问题讨论】:

标签: c# regex


【解决方案1】:

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

我不确定您对 "random words" 的确切含义,但是如果使用 C# 中的变量,我会这样做:

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

这匹配一个单词边界,然后是一个字母或下划线,后跟 0 个或多个字母/下划线/数字并以单词边界结尾。

cmets 之后的小更新:这不会产生非 ASCII 字符的问题,并且不会匹配已由其他 TokenDefiner 处理的int

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

【讨论】:

  • 这很好,但请注意 \w 也匹配非 ASCII 字母/数字,这可能不是我们所希望的。
  • 我很抱歉,这里的“随机词”是断章取义的。我的意思是除关键字 int、+ * - / = 和任何数字之外的任何其他内容。实际上除了与算术和整数有关的任何事情。
  • 基本上我在 TokenDefiniton 中有一个方法,它将匹配一个字符串源并指出哪里有一个单词'int'、数学操作数、等号或任何数字。其余的需要忽略,但似乎我仍然需要将“其他词”与正则表达式匹配,以便捕获异常。
  • 根据您要如何处理找到的匹配项,您可能想查看 this answer 以了解如何确保您 literalTokenDefiner 不会匹配 var123 = 456 中的 123 等。一般来说,我建议不要使用多个小正则表达式,而不是使用一个更大的正则表达式,并分析它返回的结果以确定如何处理匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2019-04-30
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多