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

Extract multiple integers from a String in Kotlin

我有一个以下格式的字符串(从 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 等。

我使用了在这里找到的各种选项,但其中 none 有效。到目前为止的解决方案只给了我所有的数字。

我愿意为此使用 Jsoup 或 split。

请帮忙。

我在网上找到了一个适合我的解决方案。在这里分享给其他人:

val p = Pattern.compile("\d+")
val m = p.matcher(stringUnderTest)
while (m.find()) {
  println(m.group())
}

使用正则表达式很简单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]

我尝试使用 JSoup 直接提取文本,但你是对的,因为所有内容都聚集在一起,你最终得到一个字符串,其中包含不太容易使用的所有内容。

退一步说,您可以使用 doc.select("ul li span") 获取所有可能相关的元素。从那里,您可以过滤包含以 MW 开头的文本的元素,然后从那里获取文本,将其拆分,使用 ", " 作为分隔符,获取数组并获取最后一个元素结果(整数)。我通过使用 Integer.parseInt 包装结果将其解析为整数,如果您只想要 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]