Java 尝试使用子字符串提取字符串的特定部分

Java 尝试使用子字符串提取字符串的特定部分,java,substring,Java,Substring,我正在编写一个方法来查看这种字符串的任何变体: 《电影:阿甘正传》类型:戏剧,爱情片评级:8.8成本:12.50年:1994年最佳演员:汤姆·汉克斯票房:55000000 字符串可能因名称、类型等不同而有所不同,因此我尝试编写一个方法,该方法只需检索成本(在本例中,它将检索12.50) 这是我的代码片段 public static String getPrice(String movieInfo)//returns the current price in the movie info {

我正在编写一个方法来查看这种字符串的任何变体: 《电影:阿甘正传》类型:戏剧,爱情片评级:8.8成本:12.50年:1994年最佳演员:汤姆·汉克斯票房:55000000

字符串可能因名称、类型等不同而有所不同,因此我尝试编写一个方法,该方法只需检索成本(在本例中,它将检索12.50)

这是我的代码片段

public static String getPrice(String movieInfo)//returns the current price in the movie info
{
    String price=movieInfo.substring(movieInfo.indexOf(" Cost: "), movieInfo.indexOf(" Year: "));
    return price;
}

我不确定我是否正确地应用了子字符串方法,或者它是否适用于此上下文,因此请告诉我在此上下文中使用该子字符串方法是否错误。

您可以使用许多不同的方法,当前方法中有几点可以使其始终有效:

  • 如果每个“成本:”属性后面都跟一个“年:”属性,那么它就可以工作了
  • 您需要从movieInfo.indexOf(“成本:”)+“成本:”.length()(即5)开始
  • 假设成本和下一个属性后面有一个空格,这也适用于任何属性序列:

      String cost  = movieInfo.split("Cost:")[1].split(" ")[0];
    

    希望这能有所帮助。

    如果必须这样做,我会使用regexp获得价格

         String movieInfo = "Movie:Forrest Gump Genre:Drama, Romance Rating:8.8 Cost:12.50 Year:1994 Top Actors:Tom Hanks Box Office:55,000,000";
       Pattern p = Pattern.compile("Cost:(\\d+\\.\\d+) ");
       Matcher matcher = p.matcher(movieInfo);
       matcher.find();
       System.out.println(">>"+matcher.group(1)+"<<");
    
    String movieInfo=“电影:阿甘正传类型:戏剧,浪漫评级:8.8成本:12.50年:1994年最佳演员:汤姆·汉克斯票房:55000000”;
    模式p=模式.compile(“成本:(\\d+\.\\d+);
    Matcher Matcher=p.Matcher(movieInfo);
    matcher.find();
    
    System.out.println(“>>”+matcher.group(1)+“这个问题很有趣。字符串非常棒,因为它们可以有许多不同的方法要求相同的东西,但调用不同的方法。我解决这个问题的方法是简单地将所有东西都变成一个巨大的字符串(没有空格)

    这是如何做到的?您需要知道某个字符永远不会出现在这样的字符串中。例如,冒号(:)字符可以很好地工作。但是,将间隔字符串转换为非间隔字符串是最复杂的部分。我们希望用冒号替换每个空格,并删除每个当前冒号

    String ufInfo = "Movie:Forrest Gump Genre:Drama, Romance Rating:8.8 Cost:12.50 Year:1994 Top Actors:Tom Hanks Box Office:55,000,000"
    public String makeCodeFriendlyString(String infoString) {
      return infoString.replaceAll(":", "").replaceAll(" ", ":"); // Why remove colons and then add spaces?
    }
    
    这段代码的作用是创建我们的ufInfo(userFriendlyInfo)字符串并将数据存储到其中。名为
    makeCodeFriendlyString(String infoStirng)
    的方法与它的调用完全相同。它将每个当前冒号更改为nothing,将每个当前空格更改为冒号。您将理解我们现在删除冒号的原因:

    String[] splitInfo = makeCodeFriendlyString(ufInfo).split(":");
    public static String getPrice(String cfInfo) {
      for(String s : splitInfo) if(s.startsWith("Cost") return s.substring("Cost".length());
      return "NOT-FOUND";
    }
    
    这段代码现在所做的是创建一个数组,其中包含存储在字符串中的所有数据(例如,电影标题、流派、评级等),但旁边的所有数据都与之相连。我们如何解决这个问题?这并不是一个真正的问题。我们想要这个!因为我们现在有一个类似“Cost12.50”的字符串“我们可以很容易地收集所需的数据。我们知道我们正在寻找成本,因此我们需要当前正在使用的字符串的子字符串。
    for(string s:splitInfo)
    是一个增强的for循环。它迭代所有数据集,当前字符串迭代为值s。
    if(s.startsWith(“成本”)
    检查当前字符串是否以“Cost”开头。如果以“Cost”开头,
    返回s.substring(“Cost.length());
    将返回“Cost”后面的任何字符串的
    “Cost12.50”
    ,因此将返回“12.50”

    报告任何错误

    随时乐意帮忙,
    Jarod.

    您需要添加一个分隔符(*例如)来分隔不同的部分,并使用String的split方法。然后,迭代结果数组,.startsWith(“Cost:”)应该帮助您目前的价格是多少?如果您在IDE中测试此代码会发生什么?如果您对该代码进行一些调试会发生什么?程序收到此方法的错误分支仅建议:您可以使用
    String.matches
    并使用正则表达式来获得更可靠的解决方案。
    “Cost”.length()
    等于4。您可能认为最终索引位置是5。@mastercork889它是
    “Cost:”.length()
    这是5对不起,您是对的,我没有看到冒号。但是,我也是对的;“Cost”。length()等于4。;P