gpt4 book ai didi

java - 按标签将字符串拆分为不同的变量

转载 作者:行者123 更新时间:2023-12-01 09:00:19 24 4
gpt4 key购买 nike

我需要分割一个包含带有标签的部分的字符串。例如:

String str = "This text is not highlighted <hlTag>but this is</hlTag> this"
+ " isn't again <hlTag>and this is</hlTag>";

问题是所有部分都应该保存到不同的变量中(在本例中我只是将它们打印出来),因此我的解析器应该知道哪些部分在标签内,哪些部分不在标签内。

我已经有了解决方案并且它有效,但是我在这两种情况下都使用了两个正则表达式,我认为它可以简化,所以我请求您帮助来做到这一点。

已编辑

我意识到我的解决方案是错误的 - 我失去了各个部分的顺序,并且我需要尊重它。我需要解析一次字符串,并将标记部分和非标记部分保存到不同的对象中,就像这样 - 如果突出显示,则 list.add(new HighlPart(text)),否则 list.add(new NonHighlPart(text)).

有人可以帮我吗?

String preTag = "<hlTag>";
String postTag = "</hlTag>";

Matcher insideTagsMatcher = Pattern.compile(preTag + "(.+?)" + postTag).matcher(str);
Matcher outsideTagsMatcher = Pattern.compile("^(.*?)" + preTag +
"|" + postTag + "(.*?)" + preTag +
"|" + "</hlTag>(.*?)$").matcher(str);

System.out.println("Highlighted:");
while (insideTagsMatcher.find()) {
System.out.println(insideTagsMatcher.group(1));
}

System.out.println("\nNot highlighted:");
while (outsideTagsMatcher.find()) {
for (int i = 1; i <= outsideTagsMatcher.groupCount(); i++) {
// each pattern group returns two nulls except of string we need
if (outsideTagsMatcher.group(i) != null)
System.out.println(outsideTagsMatcher.group(i));
}
}

结果是:

Highlighted:but this isand this isNot highlighted:This text is not highlightedthis isn't again

最佳答案

更清洁、更安全的方法是使用 Jsoup .

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.TextNode;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
public static void main(String[] args) {
Document document = Jsoup.parse("This text is not highlighted <hlTag>but this is</hlTag> this isn't again <hlTag>and this is</hlTag>");

List<String> highlighted = document.select("hlTag")
.stream()
.map(element -> element.html())
.collect(Collectors.toList());

List<String> nonHighlighted = document.body().childNodes().stream()
.filter(node -> node instanceof TextNode)
.map(node -> node.toString().replaceAll("\n",""))
.collect(Collectors.toList());

highlighted.forEach(System.out::println);
nonHighlighted.forEach(System.out::println);
}
}

输出:

but this is
and this is
This text is not highlighted
this isn't again

已更新问题更改后:

List 保持插入元素的顺序。您不能将不同类型的对象添加到列表中。如果我正确理解您的新需求,您可以执行以下操作:

List<Node> nodes = document.body().childNodes(); 
nodes.forEach(System.out::println);

nodes 是 Node 元素的列表。每个节点(在该示例中)可以是 TextNodeElement 类型。在您的示例中,TextNode 对应于从正文解析时未包装在标签中的内容,Element 对象对应于带有标签的内容。这样,您将拥有一个包含所有元素的唯一列表,并且您可以使用其对象类型 (instanceof) 来区分它们。

您想打印突出显示的部分吗?然后:

nodes.stream().filter(node -> node instanceof TextNode).forEach(System.out::println);

想要打印非突出显示的部分?然后:

nodes.stream().filter(node -> node instanceof Element).forEach(System.out::println);

关于java - 按标签将字符串拆分为不同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41729876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com