我正在尝试从 Java 字符串中删除第一次出现的模式。
源字符串:DUMMY01012016DUMMY01012016
格式为 1-8 个字母数字字符,后跟日期 MMddyyyy
,后跟任意数量的字母数字。
我想要实现的是删除所有开始字符,包括第一次出现的日期。因此,在下面的示例中,我将留下 DUMMY01012016
。
这是我尝试过的简化版本:".*\\d{4}(2016|2017|2015)"
除非模式匹配多次,否则效果很好。因此,在示例中 matcher.replaceFirst("")
将替换整个源字符串,而不仅仅是第一次出现的字符串。
如有任何想法,我们将不胜感激。
谢谢。斯蒂芬
最佳答案
您的问题是 *
量词是贪婪的。它将导致前面的子模式匹配尽可能多的次数,而不会导致整个匹配失败(如果有可能匹配的话)。因此,模式 .*\d{4}(2016|2017|2015)
的尾部将匹配字符串中最后一次出现的日期,而您希望它匹配第一个日期。
您可以通过切换到“不情愿”的量词来解决这个问题:
myString.replaceFirst(".*?\d{4}(2016|2017|2015)", "");
其中,*?
是一个不情愿的量词:它匹配前面子模式的零个或多个实例,尽可能少以实现整体匹配(如果整体匹配是可能的)。
关于java - 正则表达式模式的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36631519/