我想知道在尝试匹配时,是否可以在给定字符串中提取正则表达式失败的索引位置?
例如,如果我的正则表达式是“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语句。但在这样做时,我失去了返回详细错误报告的能力。因此,我至少想告知用户发生错误的地方。
答案 0 :(得分:4)
我同意Colin Younger,我认为现有的Regex类不可能。但是,如果你愿意出汗,我认为这是可行的:
答案 1 :(得分:1)
我想这样的索引只会在一些简单的情况下有意义,比如你的例子。
如果你要使用像“ab * c * z”这样的正则表达式(其中*表示任何字符)和字符串“abbbcbbcdd”,那么索引应该是什么? 这将取决于用于数学的算法...... 可能在“abbbc ......”或“abbbcbbc ......”上失败。
答案 2 :(得分:0)
我不相信这是可能的,但我很感兴趣为什么你会想要它。
答案 3 :(得分:0)
为了做到这一点,你需要在正则表达式中嵌入回调(AFAIK C#不支持),或者最好挂钩到正则表达式引擎。即便如此,如果涉及回溯,你还不清楚你会想要什么结果。
答案 4 :(得分:0)
无法判断正则表达式失败的位置。因此,您需要采取不同的方法。你需要比较字符串。使用正则表达式删除可能变化的所有内容,并将其与您知道不会更改的字符串进行比较。
我遇到了同样的问题,得出了你的答案,并且必须找出我自己的解决方案。这是:
https://stackoverflow.com/a/11730035/637142
希望有所帮助