【问题标题】:Extract several parts of a string, inside a string [duplicate]在字符串中提取字符串的几个部分[重复]
【发布时间】:2022-01-18 20:39:48
【问题描述】:

假设我有这个字符串:

/mytea/en/bt/aer?taxYear=2021&startMonth=1&endMonth=1

这里有三个参数:

  • taxYear : 4 位数 => 像“2021”
  • startMonth : 1 位或 2 位 => 从 1 到 12
  • endMonth:1 位或 2 位 => 从 1 到 12

如何从 Java 或 Scala 中的字符串中提取这些参数?


我已经试过了:

 public static void main(String []args){
     String hello = "/mytea/en/bt/aer?taxYear=2021&startMonth=1&endMonth=1";
     String test = hello.substring(52, 53);
    System.out.println(test);
 }

它返回“1”,而 test = endMonth。

但是,如果我将 url 中 endMonth 的值更改为“10”,它仍然返回“1”,而不是 10。

【问题讨论】:

  • 最简单的方法是使用java.net.URL
  • "但是,如果我将 url 中 endMonth 的值更改为“10”,它仍然返回“1”,而不是 10。” - 因为hello.substring(52, 53) 只解析出一个字符。解决这个问题的正确方法是在实际情况下使用indexOf:例如:hello.substring(X hello.indexOf("someSubstring")),或者使用hello.substring(52) 一直到字符串的末尾。

标签: java scala substring


【解决方案1】:

使用String.split 方法根据分隔符拆分字符串。这需要几个步骤,但基本上你想做这样的事情:

import java.util.HashMap;

public class StringExtract {

    public static void main(String[] args) {
        String s = "/mytea/en/bt/aer?taxYear=2021&startMonth=1&endMonth=1";

        String[] a = s.split("\\?");    // Split string around '?' character
        System.out.println(a[0] + "  " + a[1]);
        String[] b = a[1].split("&");   // Split string around '&' character

        HashMap<String, String> map = new HashMap<>();
        // For each name=value pair, split the string around '=' and print it out
        for(int i=0; i<b.length; i++) {
            String[] values = b[i].split("=");
            System.out.println("Name: " + values[0] + " Value: " + values[1]);
            map.put(values[0], values[1]); // store name/value pair in map
        }

        // Save values in variables
        int taxYear = Integer.parseInt(map.get("taxYear"));
        int startMonth = Integer.parseInt(map.get("startMonth"));
        int endMonth = Integer.parseInt(map.get("endMonth"));


    }
}

输出:

/mytea/en/bt/aer  taxYear=2021&startMonth=1&endMonth=1
Name: taxYear Values: 2021
Name: startMonth Values: 1
Name: endMonth Values: 1

【讨论】:

  • 我会将您的String#split() 替换为String.substring(),使用indexOf() 来分隔获得的子字符串。在我看来,这将是一个更清洁的解决方案。但是,我仍然赞成你的回答。
  • @hfontanez 那也行。我没有想到要这样做。 :) 我看到分隔符并自动想到String#split()
  • @M.Gianota 我想知道,您如何将这些打印值保存在单独的变量中?比如 taxYear、startMonth 和 endMonth?
  • @finalmix6 如果将存储在 values 数组中的名称/值对放入一个 HashMap 对象(map.put(values[0], values[1]) 那么您可以通过名称检索它们并设置一个变量:int taxYear = Integer.parseInt(map.get("taxYear")); 等等其他两个变量。
  • @finalmix6 我更新了答案以显示将名称/值对存储在变量中的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2021-05-20
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多