java - 正则表达式模式的问题

标签 java regex

我正在尝试从 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/

相关文章:

java - 为另一个字符串的子字符串创建一个新的字符串是多余的吗?

java - 我可以动态更改 org.apache.tomcat.jdbc.pool.DataSource 的 maxActive 属性吗?

java - 接口(interface)隔离原理应用

Python正则表达式提取关键字前的最新数字

python - 请解释正则表达式非零回顾断言如何以清晰的语言工作

php - 带替换的 sed 正则表达式

regex - 在常规中,如何替换特定行上的多次出现?

java - 在netbeans中使用视觉 Swing JPopup菜单

java - 流为空后,如何在 PushBack BufferedInputStream 中使用 unread() ?

.net - 修复Youtube URL RegEx(.NET ReGex引擎语法)