匹配失败的匹配字符串中的正则表达式索引

时间:2020-03-06 14:28:43  来源:igfitidea点击:

我想知道是否有可能在尝试匹配它的给定字符串中提取Regex失败的索引位置?

例如,如果我的正则表达式为" abc",而我尝试将其与" abd"匹配,则匹配将在索引2处失败。

编辑进行澄清。我需要这样做的原因是允许我简化应用程序的解析组件。该应用程序是一种Assmebly语言教学工具,它允许学生编写,编译和执行类似于程序的程序集。

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

给定以下输入=" INP:x:",令牌生成器将生成以下令牌。

Token.OPCODE, Token.WHITESPACE, Token.LABEL, Token.EOL

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

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

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

解决方案

我想这样的索引仅在某些简单情况下才有意义,例如示例。

如果我们要使用正则表达式,例如" ab * c * z"(其中*表示任何字符)和字符串" abbbcbbcdd",那么我们在说什么索引呢?
这将取决于用于数学运算的算法...
可能在" abbbc ..."或者" abbbcbbc ..."上失败

我不相信这是可能的,但我对我们为什么想要它很感兴趣。

我同意Colin Younger的观点,我认为现有的Regex类不可能实现。但是,我认为如果我们愿意多汗一点是可行的:

  • 获取Regex类的源代码(例如http://www.codeplex.com/NetMassDownloader来下载.Net源代码)。
  • 更改代码以使其具有带有失败索引的只读属性。
  • 确保代码使用的是Regex而不是Microsoft的正则表达式。

为了做到这一点,我们可能需要在正则表达式中嵌入回调(AFAIK C不支持),或者最好将其挂接到正则表达式引擎中。即使这样,如果涉及回溯,也不清楚我们想要什么结果。