我需要从字符串中获取一些特定的文本并将其转换为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>
答案 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);
}
否则使用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”标签。