【问题标题】:substring between two delimiters两个分隔符之间的子字符串
【发布时间】:2012-04-27 14:23:04
【问题描述】:

我有一个字符串:“这是一个应该使用的 URL http://www.google.com/MyDoc.pdf

我只需要提取从 http 开始并以 pdf 结尾的 URL: http://www.google.com/MyDoc.pdf

String sLeftDelimiter = "http://";
String[] tempURL = sValueFromAddAtt.split(sLeftDelimiter );
String sRequiredURL = sLeftDelimiter + tempURL[1];

这给了我“应该使用的http://www.google.com/MyDoc.pdf”的输出

在这方面需要帮助。

【问题讨论】:

标签: java split substring


【解决方案1】:

为什么不用startsWith("http://")endsWith(".pdf")方法String类。

两个方法都返回boolean值,如果都返回true,那么你的条件成功,否则你的条件失败。

【讨论】:

  • 问题表明他有一个字符串,其中包含“这是一个应该使用的 URL URL”。我看不出startsWith()endsWith() 在这里如何适用。
【解决方案2】:

试试这个

String StringName="This is a URL http://www.google.com/MyDoc.pdf which should be used";

StringName=StringName.substring(StringName.indexOf("http:"),StringName.indexOf("which"));

【讨论】:

  • 'which' 可能出现多次并且出现在'http:'之前
【解决方案3】:

正则表达式就是为了解决这种问题:

Pattern findUrl = Pattern.compile("\\bhttp.*?\\.pdf\\b");
Matcher matcher = findUrl.matcher("This is a URL http://www.google.com/MyDoc.pdf which should be used");
while (matcher.find()) {
  System.out.println(matcher.group());
}

正则表达式解释:

  • \b“http”前有一个字边界(即xhttp不匹配)
  • http 字符串“http”(注意这也匹配“https”和“httpsomething”)
  • .*? 任意字符 (.) 任意次数 (*),但尽量使用最少的字符 (?)
  • \.pdf 文字字符串“.pdf”
  • \b 在“.pdf”之后有一个单词边界(即 .pdfoo 不匹配)

如果您只想匹配 http 和 https,请尝试在字符串中使用它而不是 http

  • https?\: - 匹配字符串 http,然后是可选的“s”(由 s 后面的 ? 表示)和冒号。

【讨论】:

  • 非常感谢..这个真的很有帮助...因为 url 之前的文本可以是任何东西,所以我需要这个用于提取 URL 的正则表达式。
  • 如果你想支持任意字符串,要么是 URL,要么是看起来像 URL 但没有协议处理程序的字符串(例如 www.foo.com),那么使用 Gruber 的正则表达式 daringfireball.net/2010/07/improved_regex_for_matching_urls
  • 感谢您的清晰回答 ....我用作: Pattern findUrl = Pattern.compile("\\bversion-.*?\\.0.0\\b");匹配器 matcher = findUrl.matcher(response.toString()); if (matcher.find()) { System.out.println(matcher.group().substring(10,13)); // 获取子字符串 }
【解决方案4】:

您可以在此处使用Regular Expression 电源。 首先你必须在原始字符串中找到Url,然后删除其他部分。

以下代码显示了我的建议:

    String regex = "\\b(http|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
    String str = "This is a URL http://www.google.com/MyDoc.pdf which should be used";

    String[] splited = str.split(regex);

    for(String current_part : splited)
    {
        str = str.replace(current_part, "");
    }

    System.out.println(str);

这个 sn-p 代码可以检索任何字符串中的任何 url,具有任何模式。 上述正则表达式的协议部分不能添加自定义协议如https

希望我的回答能帮到你;)

【讨论】:

【解决方案5】:
public static String getStringBetweenStrings(String aString, String aPattern1, String aPattern2) {
    String ret = null;
    int pos1,pos2;

    pos1 = aString.indexOf(aPattern1) + aPattern1.length();
    pos2 = aString.indexOf(aPattern2);

    if ((pos1>0) && (pos2>0) && (pos2 > pos1)) {
        return aString.substring(pos1, pos2);
    }

    return ret;
}

【讨论】:

    【解决方案6】:

    您可以将 String.replaceAll 与捕获组和反向引用一起使用,以获得非常简洁的解决方案:

    String input = "This is a URL http://www.google.com/MyDoc.pdf which should be used";
    System.out.println(input.replaceAll(".*(http.*?\\.pdf).*", "$1"));
    

    下面是正则表达式的细分:https://regexr.com/3qmus

    【讨论】:

      最近更新 更多