2

我有一个以下格式的字符串(来自 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 或拆分。

请帮忙。

4

3 回答 3

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]
于 2020-07-30T10:40:24.103 回答
2

我尝试使用 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]
于 2020-07-30T10:43:10.277 回答
2

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

val p = Pattern.compile("\\d+")
val m = p.matcher(stringUnderTest)
while (m.find()) {
  println(m.group())
}
于 2020-07-30T10:38:15.803 回答