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

问题描述 投票:7回答:5

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

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

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

目前我有一个tokenizer类,它使用regex将输入字符串转换为Tokens。这非常有效。例如:

给定以下输入=“INP:x:”时,标记生成器将生成以下标记 :

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

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

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

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

c# regex
5个回答
4
投票

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

  1. 获取Regex类源代码(例如http://www.codeplex.com/NetMassDownloader下载.Net源代码)。
  2. 将代码更改为具有失败索引的只读属性。
  3. 确保您的代码使用的是Regex而不是Microsoft。

1
投票

我想这样的索引只会在一些简单的情况下有意义,就像在你的例子中一样。

如果您将采用像“ab * c * z”这样的正则表达式(其中*表示任何字符)和字符串“abbbcbbcdd”,那么索引应该是什么?它将取决于用于计算的算法......可能在“abbbc ...”或“abbbcbbc ...”上失败


0
投票

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


0
投票

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


0
投票

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

我遇到了同样的问题,得出你的答案,并不得不解决我自己的解决方案。这里是:

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

希望能帮助到你

© www.soinside.com 2019 - 2024. All rights reserved.