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

时间:2009-04-02 09:17:58

标签: java regex

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

我想确认一下

  1. 该字符串包含一个或多个数字,后跟一个句点。
  2. 字符串以 html 结尾。
  3. 最后,我想提取最左边的数字(即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
    }
    

    如何捕获第一场比赛?

6 个答案:

答案 0 :(得分:7)

你可以把它考虑出来:

(\d+\.)(\d+\.)*html

答案 1 :(得分:3)

"^(\\d+)\\.(\\d+\\.)*html$"

答案 2 :(得分:0)

Java风格:"(\\d+)\\..*?\\.html$"

这将1)抓住第一组连续数字,2)在单词后需要一个点,3)跳过除了3)文字字符串'.html'之外的所有内容。

如果您的意思是“一个或多个[群组]数字后跟一段时间”,那么这更符合您的要求。

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

这样您就可以得到而不是点。并且不需要捕获任何其他模式,因此它们不是。

答案 3 :(得分:0)

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> 

答案 4 :(得分:0)

是的,你可以。

如果123.html1.23html有效use this

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

如果123.html 无效1.23html 有效use this

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

如果123.html1.23html 无效,但只有1.23.html 有效use this

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

答案 5 :(得分:-1)

jpalecek的解决方案失败了;它捕获最右边的数字。原始海报更接近,但他得到了最右边的号码。要获得最左边的数字,请在第一个点后忽略任何内容:

[^\d]*(\d+)\..*html

[^ \ d] *忽略最左边的数字之前的所有内容(因此X1.html捕获数字1) (\ d +)。捕获第一个数字,如果它们后跟一个点。 。*忽略点和最终html之间的所有内容。