代码之家  ›  专栏  ›  技术社区  ›  johnstok

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

  •  4
  • johnstok  · 技术社区  · 16 年前

    3481.7.1071.html

    我想确认一下

    1. 字符串有一个或多个数字后跟句点。
    2. html格式

    我当前的regex快到了,但我无法捕获正确的组:

    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 回复  |  直到 16 年前
        1
  •  7
  •   jpalecek    16 年前

    你可以考虑一下:

    (\d+\.)(\d+\.)*html
    
        2
  •  3
  •   izb    16 年前
    "^(\\d+)\\.(\\d+\\.)*html$"
    
        3
  •  0
  •   Axeman maxelost    16 年前

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

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

    这样你就可以得到 而不是点。其他模式都不需要捕捉,所以它们不需要。

        4
  •  0
  •   Gustaf Andersson    12 年前
    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> 
    
        5
  •  0
  •   mmdemirbas    12 年前

    是的,你可以。

    123.html 1.23html 而且是 有效的 use this :

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

    如果 但是 1.23html格式 有效的 , use this

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

    如果 123.html格式 1.23html格式 无效的 但是只有 1.23.html 有效的 use this :

    ^(?:(\d+)\.).*?\.html$
    
        6
  •  -1
  •   MSalters    16 年前

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

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

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