正则表达式的部分匹配

3
我有一个被逐步构建的字符串。在构建字符串时,它会被整体与正则表达式匹配,并在找到匹配项时执行某些任务。
我的要求是:如果在字符串构建过程中发现无法找到完全匹配项,则应重置字符串并重新开始构建过程。
例如,如果正则表达式是“mada12gaskar”,并且将字符“3”添加到现有字符串“mada1”中,则字符串应清除,并重新开始构建过程,因为“mada13”永远不会与“mada12gaskar”匹配。通过Java正则表达式API是否可能实现这一点?

请提供您尝试编写的代码示例以澄清要求。正则表达式是正则表达式,因此匹配应该是可能的,但您需要其他逻辑来“清除您的字符串”。 - eebbesen
2
为什么会有踩?对我来说,这是一个相当好的问题。 - JB Nizet
我并不是专家,但为什么不直接将最后匹配的字符串(例如 mada1)存储在一个单独的变量中,并用下一个匹配的字符串覆盖它呢?如果给定的字符串(mada13)不匹配,则用单独存储的最后匹配字符串覆盖它。 - nozzleman
你应该提供一个具体的简短示例,因为似乎没有人(除了Marko Topolnik)能理解我所理解的问题。根据我的理解,如果正则表达式是 ab,那么a不匹配,所以你继续添加另一个字符:ac,但你希望停止,因为无论如何向ac添加字符都永远不会匹配正则表达式ab - JB Nizet
我对你需要支持的正则表达式子集非常感兴趣。你需要哪些功能?此外,你能否像这样表达你的意图:“我需要构建所有与特定正则表达式匹配的字符串。”?还是更像“我需要构建一个被这一千个正则表达式全部匹配的字符串。”或者简单地说,“如果我们添加了一些内容,我需要知道这个字符串是否可以完全匹配这个正则表达式。”? - Petr Janeček
我是指“如果我们附加了一些内容,我需要知道这个字符串是否可以被这个正则表达式完全匹配?” 我正在编写一个通用框架,在实现时不知道正则表达式,并且将在实现时进行配置。 - jrpalla
1个回答

7
我认为我找到了你问题的可能解决方案。
看一下Matcher#hitEnd()方法:
返回true,如果在此匹配器执行的上次匹配操作中搜索引擎命中输入的末尾。
当此方法返回true时,最后一次搜索的结果可能会因更多的输入而更改。
现在,只需使用Matcher(可通过Pattern实例获得)将regexp与尚未完全构建的String进行匹配,并查看结果:
- 如果匹配成功,则您获胜; - 如果没有匹配成功,请查看hitEnd(): - 如果是true,则构建更多的字符串并重试; - 如果是false,则当前字符串永远无法匹配,您可以放弃它并重新开始。

2
我的回答被删除了,向你致敬。 - Marko Topolnik
只有一个警告:如果它是“false”,当前的字符串永远无法匹配,您可以放弃并重新开始。实际上,您应该回溯,可能会找到具有相同前缀的不同字符串。 - Marko Topolnik
@MarkoTopolnik 当我发现这个方法时,我也感到非常惊讶。不过,在Matcher类中还有一些好东西可以学习,我不知道其他一半的方法是做什么的。至于回溯-是的,当然。 - Petr Janeček
非常感谢!这似乎是我的解决方案。我将尝试它。 - jrpalla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接