在循环中剪切String的特定部分

时间:2014-08-11 22:30:02

标签: java string

我有一个像这样的字符串:

String content = "{"begin"bf3b178a70.jpg","end",....},{"id":,"f06190e8938.jpg","end",....}"

我希望像这样删除图像ID:

bf3b178a70.jpg
f06190e893.png

之后,我想用一个像这样的新网址编写图像ID:

url.com/image/bf3b178a70.jpg
url.com/image/f06190e893.png

我从substring()开始剪切第一部分并使用content.split(""id":,");,但我遇到了字符串数组和普通字符串的问题。我使用带有for循环的字符串数组,因为真正的字符串非常长。

请有人帮助我吗?

2 个答案:

答案 0 :(得分:1)

乍一看,您的字符串格式为JSON。如果是这种情况,您可以使用JSON.org Java parserJSON.org site上列出的众多其他解析器之一将其分解,或者只是按照它们提供的语法图表进行操作;由于JSON不是regular language

,因此不建议使用简单的字符串斩波

我现在假设您正在接收JSON数组对象(方括号,逗号分隔),并且您正在从文件或Web服务中读取,其中任何一个都提供InputStream。如果您还有其他内容,则可以将Reader或普通String传递给JSONTokener构造函数,或者如果您有字节数组,则可以将其包装在ByteArrayInputStream中并将其传递给。

我没有JDK方便甚至检查这是否编译:-)但是这里有。

import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import org.json.*;

public class ImageListProcessor
{
    public static ArrayList<URL> processList(InputStream toProcess, URL baseURL)
        throws JSONException, MalformedURLException
    {
        JSONTokener toProcessTokener = new JSONTokener(toProcess);
        JSONObject toProcessResponse = new JSONObject(toProcess);
        if (!toProcessResponse.isNull("error")) {
            // it's an error response, probably a good idea to get out of here
            throw new JSONException("Response contains error: " + toProcessResponse.get("error"));
        }
        JSONArray toProcessArray = toProcessResponse.getJSONArray("items");
        int len = toProcessArray.length();
        ArrayList<URL> result = new ArrayList<URL>(len);
        for(int i = 0; i < len; i++) {
            JSONObject imageRecord = toProcessArray.getJSONObject(i);
            String imagePath = imageRecord.getString("image");
            // if you want to remove the date portion of the path:
            imagePath = imagePath.substring(1 + imagePath.lastIndexOf('/'));
            URL combinedURL = new URL(baseURL, imagePath);
            result.add(combinedURL);
        }
        return result;
    }
}

答案 1 :(得分:0)

尝试这样的事情:

import java.util.regex.*;

public class ReplaceDemo {
    public static void main(String[] args) {
    String input = 
              "User clientId=23421. Some more text clientId=33432. This clientNum=100";

    Pattern p = Pattern.compile("(clientId=)(\\d+)");
    Matcher m = p.matcher(input);

    StringBuffer result = new StringBuffer();
    while (m.find()) {
        System.out.println("Masking: " + m.group(2));
        m.appendReplacement(result, m.group(1) + "***masked***");
    }
    m.appendTail(result);
    System.out.println(result);
}
}