如何在字符和第一次出现双引号之间获取字符串?

时间:2017-12-05 16:40:26

标签: java android

我正在尝试获取tvg-logo字符串(http://awebsite/logos/TestChannel.png),但我目前的代码仅适用于案例一。对于案例2和3输入,代码不仅输出tvg-logo值,还输出其余的在它之后的字符串!你能告诉我如何在所有这些情况下获得 ONLY tvg-logo网址吗?谢谢

public class HelloWorld {
  public static void main(String[] args) {

    //case 1:
    //String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\"";
    //case 2:
    //String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\" group-title=\"Movies\"";
    //case 3:
    String s="-1 tvg-logo=\"http://awebsite/logos/TestChannel.png\" tvg-name=\"Test Channel\" group-title=\"Movies\"";

    String icon = s.substring(s.indexOf("tvg-logo") + "tvg-logo".length()).replace("=", "").replace("\"", "").replace("\n", "");

    System.out.println("Logo:"+icon);
  }
}

案例3输入的输出:

Logo:http://awebsite/logos/TestChannel.png tvg-nameTest Channel group-titleMovies

所有类型输入案例的预期输出:

Logo:http://awebsite/logos/TestChannel.png

5 个答案:

答案 0 :(得分:1)

您需要向substring调用添加第二个参数以限制子字符串的长度,如下所示:

public class Main {
  public static void main(final String[] args) {

    // case 1:
    // String s = "-1 tvg-name=\"Test Channel\"
    // tvg-logo=\"http://awebsite/logos/TestChannel.png\"";
    // case 2:
    String s =
            "-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\" group-title=\"Movies\"";
    // case 3:
    // String s =
    // "-1 tvg-logo=\"http://awebsite/logos/TestChannel.png\" tvg-name=\"Test
    // Channel\" group-title=\"Movies\"";

    String tvgLogo = "tvg-logo=\"";
    int tvgLogoIndex = s.indexOf(tvgLogo) + tvgLogo.length();
    String icon = s.substring(tvgLogoIndex, s.indexOf('"', tvgLogoIndex)).replace("=", "")
            .replace("\"", "").replace("\n", "");

    System.out.println("Logo:" + icon);
  }
}

s.indexOf('"', tvLogoIndex)调用会搜索关闭tvg-logo属性的双引号,以便您只选择徽标网址。

请注意,如果您正在解析HTML文档,那么解决方案可能比使用子字符串更清晰。

答案 1 :(得分:1)

这是使用正则表达式的另一个。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld {

    public static void main(String[] args) {

        String s="-1 tvg-logo=\"http://awebsite/logos/TestChannel.png\" tvg-name=\"Test Channel\" group-title=\"Movies\"";

        // Pattern matcher looking for shortest string surrounded with escaped quotes
        // following tvg-logo=\"
        // Two groups, first is string tvg-logo and second is the logo string
        Matcher tvgMatcher = Pattern.compile("(tvg-logo)=\\\"([^\\\"]+)\\\"").matcher(s);

        while (tvgMatcher.find()) {
            String icon = tvgMatcher.group(2);
            System.out.println(tvgMatcher.group(1)+": "+icon);
        }
    }   
}

输出

tvg-logo: http://awebsite/logos/TestChannel.png

答案 2 :(得分:0)

public class HelloWorld
{
    public static void main (String[] args) throws java.lang.Exception
    {
        //case 1:
    //String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\"";
    //case 2:
    //String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\" group-title=\"Movies\"";
    //case 3:
    String s="-1 tvg-logo=\"http://awebsite/logos/TestChannel.png\" tvg-name=\"Test Channel\" group-title=\"Movies\"";

    String icon="";
    String[] splited = s.split("\\s+");
    for(int i=0;i<splited.length;i++){
        if(splited[i].contains("tvg-logo")){
            icon = splited[i].substring(10);
        }
    }
    //String icon = s.substring(s.indexOf("tvg-logo") + "tvg-logo".length()).replace("=", "").replace("\"", "").replace("\n", "");

    System.out.println("Logo:"+icon);
    }
}

答案 3 :(得分:0)

您可以插入该行 icon = icon.substring(0,icon.indexOf(“”)); 提取它。

public static void main(String [] args){

    //case 1:
    //String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\"";
    //case 2:
    //String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\" group-title=\"Movies\"";
    //case 3:
    String s="-1 tvg-logo=\"http://awebsite/logos/TestChannel.png\" tvg-name=\"Test Channel\" group-title=\"Movies\"";
    String icon = s.substring(s.indexOf("tvg-logo") + "tvg-logo".length()).replace("=", "").replace("\"", "").replace("\n", "");
    icon=icon.substring(0,icon.indexOf(".png")+4);
    System.out.println("Logo:"+icon);
  }

答案 4 :(得分:0)

如果我是对的,这就是你的代码中发生的事情:

  • 您的字符串构建器逻辑(“s.substring ....”)适用于案例1,因为它非常适合这种情况;
  • 在案例2中,您还有“group-title”并且您没有管理此案例,因此仍然会继续出现在最终字符串中;
  • 在案例3中,情况与案例2相同,而且tvg-logo和tvg-name的顺序不同。

最后,您的代码会对案例1过度拟合。 在每个案例的每个字符串中保持相同的顺序,并管理字符串末尾有group-title的情况。

试试这个(我没试过):

boolean groupFound = false;
//case 1:
//String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\"";
//case 2: {
//String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\" group-title=\"Movies\"";
//groupFound = true;}
//case 3: {
String s="-1 tvg-name=\"Test Channel\" tvg-logo=\"http://awebsite/logos/TestChannel.png\"  group-title=\"Movies\"";
groupFound = true; }

String icon = s.substring(s.indexOf("tvg-logo") + "tvg-logo".length()).replace("=", "").replace("\"", "").replace("\n", "");
if(groupFound){
   String group = "group-title";
   int groupIndex = String.indexOf(group);
   String newIcon = icon.substring(0, groupIndex);
}