我有一个以下格式的String(Jsoup的输出)
[<ul>
<li><span></span><a, rel="nofollow"><span>Afterword</span></a></li>
<li><span></span><a, rel="nofollow"><span>MW, Chapter, 2255</span></a></li>
<li><span></span><a, rel="nofollow"><span>MW, Chapter, 2254</span></a></li>
<li><span></span><a, rel="nofollow"><span>MW, Chapter, 2253</span></a></li>
<li><span></span><a, rel="nofollow"><span>MW, Chapter, 2252</span></a></li>
</ul>]
我想从此字符串中提取2255、2254等整数。
我使用了在这里找到的各种选项,但是没有一个起作用。到目前为止,解决方案只给我提供了所有数字。
我愿意为此使用Jsoup或split。
请帮助。
答案 0 :(得分:6)
使用正则表达式https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/
非常简单 val string = "[<ul>\n" +
"<li><span></span><a, rel=\"nofollow\"><span>Afterword</span></a></li>\n" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2255</span></a></li>\n" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2254</span></a></li> \n" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2253</span></a></li> \n" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2252</span></a></li> \n" +
"</ul>]"
val regex = Regex("\\d+")
val resultList = regex.findAll(string).map { it.value }.toList()
println(resultList) //prints [2255, 2254, 2253, 2252]
答案 1 :(得分:2)
我在网上找到了对我有用的解决方案。在这里与其他人分享:
val p = Pattern.compile("\\d+")
val m = p.matcher(stringUnderTest)
while (m.find()) {
println(m.group())
}
答案 2 :(得分:2)
我尝试直接使用JSoup提取文本,但您是对的,因为所有内容都被捆绑在一起,最终得到一个包含所有不易使用的内容的字符串。
然后退后一步,您可以使用doc.select("ul li span")
获得所有可能相关的元素。在此处,您可以过滤包含以MW
开头的文本的元素,然后从此处过滤文本,并以", "
为分隔符将其分割,以获取数组并获取的最后一个元素结果(整数)。我通过使用Integer.parseInt
包装结果将其解析为Integer,如果只需要String
值,可以将其删除。
最后,将过滤并映射到正确值的结果收集到列表中。
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import static java.util.stream.Collectors.toList;
public class JSoupExtract {
public static final String input = "<ul>" +
"<li><span></span><a, rel=\"nofollow\"><span>Afterword</span></a></li>" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2255</span></a></li>" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2254</span></a></li>" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2253</span></a></li>" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2252</span></a></li>" +
"</ul>"; // TOKEN_ID = 0^ 1^ 2^
public static final int INT_TOKEN_ID = 2;
public static void main(String[] args) {
Document doc = Jsoup.parse(input);
Elements elements = doc.select("ul li span");
List<Integer> result = elements.stream()
.filter(e -> e.text() != null && e.text().startsWith("MW"))
.map(e -> Integer.parseInt(e.text().split(", ")[INT_TOKEN_ID]))
.collect(toList());
System.out.println(result);
}
}
输出:
[2255, 2254, 2253, 2252]