【问题标题】:Regex index in matching string where the match failed匹配失败的匹配字符串中的正则表达式索引
【发布时间】:2010-09-11 13:34:16
【问题描述】:

我想知道是否可以提取给定字符串中正则表达式在尝试匹配时失败的索引位置?

例如,如果我的正则表达式是“abc”并且我尝试将其与“abd”匹配,则匹配将在索引 2 处失败。

为澄清而编辑。我需要这个的原因是允许我简化我的应用程序的解析组件。该应用程序是一个汇编语言教学工具,允许学生编写、编译和执行汇编类程序。

目前我有一个标记器类,它使用正则表达式将输入字符串转换为标记。这很好用。例如:

在给定以下输入 = "INP :x:"
:

的情况下,标记器将生成以下标记
Token.OPCODE, Token.WHITESPACE, Token.LABEL, Token.EOL

然后分析这些标记以确保它们符合给定语句的语法。目前这是使用 IF 语句完成的,并且被证明很麻烦。这种方法的好处是我可以提供详细的错误消息。即

if(token[2] != Token.LABEL) { throw new SyntaxError("Expected label");}

我想使用正则表达式来定义语法而不是烦人的 IF 语句。但是这样做我失去了返回详细错误报告的能力。因此,我至少想通知用户错误发生的位置。

【问题讨论】:

  • 我很想知道这是否真的变得更容易了。从来没有看过编译器的代码,我的猜测是生成错误消息的代码通常看起来和你现在的差不多。
  • 最后我决定继续使用 IF 语句。不过,我从任何派生的 Statement 类中删除了实际的 IF 语句,而是在我的基本 Statement 类中放置了一个 CheckSyntax() 方法,该方法执行 IF 检查/抛出异常。这让我删除了很多重复的代码。

标签: c# regex


【解决方案1】:

我同意 Colin Younger 的观点,我认为现有的 Regex 类不可能。不过,如果你愿意出一点汗,我认为是可行的:

  1. 获取Regex类源代码 (例如。 http://www.codeplex.com/NetMassDownloader 下载 .Net 源代码)。
  2. 将代码更改为只读 具有失效指数的属性。
  3. 确保您的代码使用该正则表达式 而不是微软的。

【讨论】:

    【解决方案2】:

    我猜这样一个索引只有在一些简单的情况下才有意义,比如你的例子。

    如果你要使用像“ab*c*z”这样的正则表达式(其中 * 我的意思是任何字符)和字符串“abbbcbbcdd”,那么索引应该是什么,你在说什么? 这将取决于用于数学运算的算法...... 可能在“abbbc...”或“abbbcbbc...”上失败

    【讨论】:

    • 我希望第一个索引从左到右。在您的示例中,我相信“abbbcbbcdd”会匹配得很好,直到正则表达式需要“z”字符为止。
    • 对我来说,正则表达式显示第一个冲突的期望是相当合理的。为什么不呢?
    【解决方案3】:

    我不相信这是可能的,但我很好奇你为什么想要它。

    【讨论】:

    • 我在我的问题中添加了一个关于原因的简短摘要。为你的回答干杯
    【解决方案4】:

    为了做到这一点,您需要嵌入在正则表达式中的回调(AFAIK C# 不支持),或者最好挂钩到正则表达式引擎。即使这样,如果涉及回溯,您还不清楚您想要什么结果。

    【讨论】:

      【解决方案5】:

      无法判断正则表达式在哪里失败。因此,您需要采取不同的方法。您需要比较字符串。使用正则表达式删除所有可能变化的内容,并将其与您知道它不会更改的字符串进行比较。

      我遇到了同样的问题,想出了你的答案,我不得不自己想办法。这里是:

      https://stackoverflow.com/a/11730035/637142

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 2013-12-25
        相关资源
        最近更新 更多