[英]How can I match a repeating pattern with Java regular expressions?
给定以下输入字符串3481.7.1071.html
我想确认
最后,我想提取最左边的数字(即 3481)。
我当前的正则表达式几乎就在那里,但我无法捕获正确的组:
final Pattern p = Pattern.compile("(\\d++\\.)+html");
final Matcher m = p.matcher("3481.7.1071.html");
if (m.matches()) {
final String corrected = m.group(1)+"html"; // WRONG! Gives 1071.html
}
如何捕捉第一场比赛?
你可以把它分解出来:
(\d+\.)(\d+\.)*html
"^(\\d+)\\.(\\d+\\.)*html$"
groovy:000> p = java.util.regex.Pattern.compile("(\\d+).*")
===> (\d+).*
groovy:000> m = p.matcher("3481.7.1071.html")
===> java.util.regex.Matcher[pattern=(\d+).* region=0,16 lastmatch=]
groovy:000> m.find()
===> true
groovy:000> m.group(1)+".html"
===> 3481.html
groovy:000>
Java 样式: "(\\d+)\\..*?\\.html$"
这将 1) 获取第一组连续数字,2) 在单词之后需要一个点,3) 跳过除 3) 文字字符串“.html”之外的所有内容。
如果您的意思是“一个或多个 [组] 数字后跟一个句点”,那么这更符合您的要求。
"(\\d+)(?:\\.\\d+)*\\.html$"
这样你得到一个数字而不是点。 并且不需要捕获任何其他模式,所以它们不是。
jpalecek 的解决方案失败了; 它捕获最右边的数字。 原始海报更接近,但他得到了最右边的数字。 要获得最左边的数字,请忽略第一个点之后的任何内容:
[^\d]*(\d+)\..*html
[^\d]* 忽略最左边数字之前的所有内容(因此 X1.html 捕获数字 1)(\d+)。 捕获第一个数字,如果它们后跟一个点。 .* 忽略点和最终 html 之间的所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.