从Kotlin中的字符串中提取多个整数

时间:2020-07-30 10:07:52

标签: kotlin split jsoup

我有一个以下格式的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。

请帮助。

3 个答案:

答案 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]