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

时间:2014-05-21 07:14:25

标签: java substring

我正在编写此方法来查看此类字符串的任何变体: “电影:阿甘正传:剧情,浪漫评级:8.8成本:12。50年:1994年最佳演员:汤姆汉克斯票房:55,000,000”

字符串可能因名称,流派等而异。所以我正在尝试编写一种只需检索Cost的方法(在本例中,它将为我检索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;
}

我不确定我是否正确地应用了substring方法,或者它是否适合在此上下文中使用,所以如果我在这种情况下使用该substring方法我是错误的,请告诉我。

3 个答案:

答案 0 :(得分:1)

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

  
      
  1. 如果每个“Cost:”属性后跟一个“Year:”属性,那么它将起作用
  2.   
  3. 您需要从movieInfo.indexOf(“费用:”)+“费用:”开始。长度()(即5)
  4.   

假设在cost和next属性之后会有一个空格,这也适用于任何属性序列:

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

希望这有帮助。

答案 1 :(得分:1)

如果我必须这样做,我会使用正则表达式来获取价格。

     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)+"<<");

这是一个例子。

答案 2 :(得分: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)的方法完全符合它的要求。它将每个当前冒号更改为空,并将每个当前空间更改为冒号。你会理解为什么我们现在删除了冒号:

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”开头。如果是,return s.substring("Cost".length());将返回“{1}”的子字符串,而不是“费用”之后的任何内容,因此它将返回“12.50”

报告任何错误!

很高兴随时提供帮助, 贾罗德。