【问题标题】:Java I am unable to find more than 1 regex matchJava 我找不到超过 1 个正则表达式匹配
【发布时间】:2021-09-07 19:10:22
【问题描述】:

我正在尝试抓取此网页。我需要在“等级名称”下找到所有名称

网址:https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&page=1

但是我遇到了一个大问题。只找到第一个匹配项(Lynx Titan)。 log(m.group(1).split("\"")[0]); 与 Lynx Titan 匹配。但是如果我将 [0] 替换为 1 或 2,它就不起作用。它应该显示下一个名称。任何帮助表示赞赏

public void getRsn() throws IOException {
        URL url = new URL("https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&page=1");
        URLConnection conn = url.openConnection();
        conn.setRequestProperty("User-Agent",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0");
        conn.connect();
        BufferedReader serverResponse = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));

        String s =  serverResponse.lines().collect(Collectors.joining());

        Matcher m = Pattern.compile("user1=(.*)\">").matcher(s);
        while(m.find()) {
            log(m.group(1).split("\"")[0]);
        }

        serverResponse.close();
    }

【问题讨论】:

  • 不要使用正则表达式 - 使用 JSoup
  • P.S.顺便说一句,您的代码对我来说很好用,拆分部分似乎没有必要 - 第一组不包含引号字符

标签: java regex


【解决方案1】:

你的问题是你的正则表达式:你只匹配一个用户。此外,while 循环的每次迭代都会找到另一个用户,而不是拆分的每个元素(您实际上不需要)。

使用匹配每个用户的正则表达式,用户名:

Matcher m = Pattern.compile("(?<=user1=)[^\"]+").matcher(s);
while(m.find()) {
    System.out.println(m.group()); // the entire match is the user name
}

【讨论】:

    【解决方案2】:

    试试这个方法,

    URL url = new URL("https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&page=1");
    URLConnection conn = url.openConnection();
    conn.setRequestProperty("User-Agent",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0");
    conn.connect();
    BufferedReader serverResponse = new BufferedReader(
            new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
    
    String s =  serverResponse.lines().collect(Collectors.joining());
    serverResponse.close();
    Matcher m = Pattern.compile("(user1=)([a-zA-Z0-9\\s\\�]+)(\">)").matcher(s);
    while(m.find()) {
        System.out.println((m.group(2).replaceAll("\\�", " ")));
    }
    

    我的输出是,

    Lynx Titan
    Hey Jase
    ShawnBay
    senZe
    Tomdabom
    Karma
    Harmony
    DedWilson
    GodTormentor
    Vinny
    borsi
    Brundeen
    Aziz
    Eeli
    baile y
    gaslighter73
    Dan Gleesac
    blind idiot
    he box jonge
    Gustav
    Randalicious
    Oskar
    Killzone
    moksi
    Capt King
    

    更新

    字符集实际上是ISO_8859_1 而不是UTF_8。所以你可以把这个答案做得更好。

    URL url = new URL("https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&page=1");
    URLConnection conn = url.openConnection();
    conn.setRequestProperty("User-Agent",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0");
    conn.connect();
    BufferedReader serverResponse = new BufferedReader(
            new InputStreamReader(conn.getInputStream(), StandardCharsets.ISO_8859_1));
    
    String s =  serverResponse.lines().collect(Collectors.joining());
    serverResponse.close();
    Matcher m = Pattern.compile("(user1=)([a-zA-Z0-9\\ \\ ]+)(\">)").matcher(s);
    while(m.find()) {
        System.out.println((m.group(2)));
    }
    

    注意:文档中有两个不同的空格字符

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2015-11-11
      • 2011-08-02
      相关资源
      最近更新 更多