繁体   English   中英

如何将重复模式与 Java 正则表达式匹配?

[英]How can I match a repeating pattern with Java regular expressions?

给定以下输入字符串3481.7.1071.html

我想确认

  1. 该字符串有 1 个或多个数字,后跟一个句点。
  2. 字符串以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> 

是的你可以。

如果123.html1.23html有效,请使用

^(?:(\d+)\.).*?html$

如果123.html无效1.23html有效,请使用

^(?:(\d+)\.(?!h)).*?html$

如果123.html1.23html无效但只有1.23.html有效,请使用

^(?:(\d+)\.).*?\.html$

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM