将`<pre>` and `</pre>`之间的文本添加到ArrayList中

时间:2012-09-10 14:07:06

标签: java android eclipse string arraylist

我需要从字符串中获取一些特定的文本并将其转换为arraylist,但我不知道从哪里开始。 字符串如下所示:

String exampleString = "some text I don't know <pre>the text I want to get</pre><pre>Some more text I want to get</pre> some text I don't know"

但问题是我不知道<pre> text </pre>有多少文字部分,甚至可能根本没有这些部分。

所以有人可以告诉我如何在<pre></pre>之间获取文本,以及如何将这些文本纳入arraylist。

非常感谢你!

更新:我所知道的关于我所说的“我不知道的一些文字”的文字是它不包含<pre></pre>

4 个答案:

答案 0 :(得分:2)

假设没有嵌入式标签,您可以这样做:

private List<String> getText(String text){

    List<String> result = new ArrayList<String>();

    String[] sections = text.split("<pre>");
    int i = 0;
    for (String s : sections) {
        i = s.indexOf("</pre>");
        if (i >= 0)          
           results.add(s.substring(0, i));        
    }  
    return result;
}

时运行的代码示例

说:

text = "test text here <pre> item one </pre> and then another item <pre> item 2 </pre> and then some stuff."

所以首先要解释的是:

String[] sections = text.split("<pre");

这定义了一个新的字符串数组,并将其分配给调用&#34; text&#34;

的字符串拆分函数的结果。

此函数将字符串分解为"<pre>"分隔的部分,以便获得:

sections[0] = "test text here" 
sections[1] = "item one </pre> and then another item"
sections[2] = "item 2 </pre> and then some stuff."

所以我们现在需要做的就是删除"</pre>"之后的任何内容,这是下一位的来源:

for (String s : sections)

每个&#34;的开始是什么?循环,依次将String s分配给数组部分的每个元素。

因此,对于上面3个字符串中的每一个,我们都这样做:

 i = s.indexOf("</pre>");
    if (i >= 0)          
       results.add(s.substring(0, i));

因此,如果字符串包含</pre>,则从开头到"</pre>"取一个子字符串,并将其添加到我们的结果中。由于部分[1]和部分[2]包含它,它们将最终出现在结果中。

我希望这有帮助吗?


以下是我如何实施JavaJugglers解决方案以避免使用while(true):

private List<String> getText(String text){
    List<String> result = new ArrayList<String>();

    int indexStart = text.indexOf("<pre>");
    int indexEnd = text.indexOf("</pre>");
    while (indexStart >= 0 && indexEnd > indexStart) {
        result.add(text.substring(indexStart + 5, indexEnd));
        text = text.substring(indexEnd + 6);
        indexStart = text.indexOf("<pre>");
        indexEnd = text.indexOf("</pre>");
    }

    return result;
}

答案 1 :(得分:1)

try {
    Pattern pattern = Pattern.compile("<pre>(.+?)</pre>");
    Matcher matcher = pattern.matcher(yourText);

    while (matcher.find()) {
        //  matcher.group() will contain the match from the previous find() statement
    }
}
catch(Exception ex){}

编辑:更正的正则表达式语法

答案 2 :(得分:0)

如果您确定HTML格式正确,可以先使用简单的String方法开始:

String foo = "some text I don't know <pre>the text I want to get</pre><pre>Some more text I want to get</pre> some text I don't know";
int preStart = foo.indexOf("<pre>");
int preEnd = foo.indexOf("</pre>", preStart);

if (preStart > -1 && preEnd > preStart)
{
    String inBetweenTags = foo.substring(preStart + 5, preEnd);
    System.out.println(inBetweenTags);
}

http://ideone.com/OkE9B

否则使用HTML解析器。

答案 3 :(得分:0)

这是一个简单的解决方案:

private List<String> getText(String text){

    List<String> result = new ArrayList<String>();

    while(true){
        int indexStart = text.indexOf("<pre>");
        int indexEnd = text.indexOf("</pre>");
        if(indexStart >= 0 && indexEnd >= 0 && indexEnd > indexStart){
            result.add(text.substring(indexStart + 5, indexEnd));
            text = text.substring(indexEnd + 6);
        }
        else{
            break;
        }

    }
    return result;
}

请记住,您可以将此功能更改为更通用,例如将String作为参数传递给搜索并动态计算子字符串偏移量。我不建议您使用正则表达式,因为您可能有以下字符串:

<pre>text<pre>more text</pre>some more text</pre>

使用嵌套的“pre”标签。