-3

我需要从字符串中获取一些特定的文本并将其放入数组列表中,但我不知道从哪里开始。字符串如下所示:

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>如何将它们放入数组列表中。

太感谢了!

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

4

4 回答 4

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

这定义了一个新的字符串数组并将其分配给调用“text”的字符串拆分函数的结果

此函数将字符串分解为由 分隔的部分,"<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)

是“for each”循环的开始,该循环将 String s 依次分配给数组部分的每个元素。

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

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

因此,如果字符串包含</pre>,则从开始到 取一个子字符串"</pre>"并将其添加到我们的结果中。由于sections[1] 和sections[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;
}
于 2012-09-10T14:14:29.757 回答
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){}

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

于 2012-09-10T14:38:06.840 回答
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;
}

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

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

带有嵌套的“pre”标签。

于 2012-09-10T14:27:21.153 回答
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 解析器。

于 2012-09-10T14:10:49.663 回答