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

时间:2008-09-20 06:30:05

标签: c# regex

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

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

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

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

如果给出以下输入=“INP:x:”,则tokenizer将生成以下标记:

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

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

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

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

希望有所帮助