匹配失败的匹配字符串中的正则表达式索引
时间: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不支持),或者最好将其挂接到正则表达式引擎中。即使这样,如果涉及回溯,也不清楚我们想要什么结果。