【问题标题】:Partial matching of Regular expression [duplicate]正则表达式的部分匹配[重复]
【发布时间】:2013-07-20 08:31:19
【问题描述】:

我有一个增量构建的字符串。在构建字符串时,通过正则表达式将其作为一个整体进行匹配,当找到匹配时,执行特定任务。

我的要求是:如果在字符串构建过程中发现找不到完全匹配的方法,那么应该重置字符串并重新启动构建过程。

例如,如果一个正则表达式是"mada12gaskar",当一个字符"3"被添加到一个现有的字符串"mada1"时,这个字符串应该被清除并且构建过程应该重新开始,因为"mada13"永远不会匹配"mada12gaskar"。这可以通过 Java regex API 实现吗?

【问题讨论】:

  • 提供您尝试编写的代码示例以阐明要求。正则表达式是正则表达式,所以匹配应该是可能的,但你需要其他逻辑来“清除你的字符串”。
  • 为什么投反对票?这对我来说是一个很好的问题。
  • 我不是专家,但你为什么不简单地将最后一个匹配字符串(例如mada1)存储在一个单独的变量中,该变量会被下一个匹配字符串覆盖?如果给定的字符串(mada13)不匹配,用最后一个匹配的字符串覆盖它,单独存储..
  • 您应该添加一个具体的简短示例来说明您想要什么,因为似乎没有人(Marko Topolnik 除外)理解我所理解的问题。据我了解,如果正则表达式为ab,则a 不匹配,因此您继续并添加另一个字符:ac,并且您想停止,因为无法将字符添加到ac 将永远匹配正则表达式ab.
  • 我对您需要支持的正则表达式子集非常感兴趣。您需要哪些功能?另外,您能否将您的意图表述为 “我需要构建与特定正则表达式匹配的所有字符串。”?还是更像“我需要构建一个与所有这千个正则表达式匹配的字符串。”,或者只是“我需要知道这个字符串是否可以完全匹配正则表达式,如果我们在其上附加了一些东西。”?

标签: java regex


【解决方案1】:

我想我找到了解决您问题的可能方法。

Matcher#hitEnd()方法:

如果输入的结尾被搜索引擎在 此匹配器执行的最后一次匹配操作。

当此方法返回 true 时,可能会有更多输入 会改变上次搜索的结果。

现在,只需使用 Matcher(可通过 Pattern 实例获得)将正则表达式与尚未完全构造的字符串匹配并查看结果:

  • 如果匹配,您就有了获胜者
  • 如果不匹配,请查看hitEnd()
    • 如果是true,请构建更多字符串并重试
    • 如果是false,当前字符串永远无法匹配,你可以放弃它重新开始

【讨论】:

  • 脱帽致敬,我的答案已删除。
  • 只有一个警告:“如果是false,当前的字符串永远无法匹配,你可以放弃它并重新开始”---实际上你应该回溯和可能会找到具有相同前缀的不同字符串。
  • @MarkoTopolnik 当我发现这个方法时,我同样感到惊讶。尽管如此,在Matcher 课程中仍有一些好东西要学习,我不知道其他方法的一半是做什么的。关于回溯 - 是的,当然。
  • 非常感谢!这似乎是我的解决方案。我会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 2017-11-29
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多