gpt4 book ai didi

java - 从正则表达式中检索不匹配和匹配的文本

转载 作者:行者123 更新时间:2023-12-02 06:44:49 25 4
gpt4 key购买 nike

我正在尝试搜索可以包含 html 和纯文本的 Java 字符串。如果 html 用单个勾号 ('<b>'text'<b>') 包裹起来或者一段 html 被三个勾号 ('''<html><head><title>Sample</title></head><body><div>text</div></body></html>''') 包裹起来,我不需要从字符串中删除 html。如果 html 没有用单勾或三勾包裹,那么我需要删除 html。

如果内容不混合,下面的代码可以正常工作。我想修改它,以便如果 String value="non <b>ticked</b> content <u>here</u> and '<b>'mixed'</b>' content '<u>'here'</u>'将被写入内存/返回为 non ticked content here and '<b>'mixed'</b>' content '<u>'here'</u>'

我相信我需要更改正则表达式,以便仅将未勾选的(单个或三个)内容传递给我的 jsoup html2text 方法。关于如何更改正则表达式或逻辑以便仅将未勾选的内容传递给 html2text 方法的任何想法?如果我将整个字符串(带有勾选的内容)传递给 jsoup ,它将删除所有 html,这是不需要的。

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

public class HtmlSerializer extends StdSerializer<String> {
private static final Logger LOG = LoggerFactory.getLogger(HtmlSerializer.class);
private static final Pattern singlePattern = Pattern.compile("'.*'");
private static final Pattern blockPattern = Pattern.compile("'''.*'''");

protected HtmlSerializer() {
super(String.class);
}

@Override
public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
JsonGenerationException {
if(StringUtils.isNotBlank(value)){
Matcher blockMatcher = blockPattern.matcher(value);
Matcher singleMatcher = singlePattern.matcher(value);
if(!blockMatcher.find() && !singleMatcher.find()){
jgen.writeString(html2text(value));
}else{
jgen.writeString(value);
}
}else{
jgen.writeString(value);
}
}

private static String html2text(String html) {
return Jsoup.parse(html).text();
}
}

最佳答案

您的模式无法正常工作,因为 .*尽可能匹配。因此'.*'将从第一次出现 ' 开始匹配直到最后一次出现 '无论有多少'介于两者之间。在您的示例中,它将匹配整个序列 '<b>'mixed'</b>' content '<u>'here'</u>' .

要解决这个问题,最简单的方法是使用“勉强量词”。 (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum) '.*?'将尽可能少地匹配,因此在下一次出现 ' 时停止.

这同样适用于您的组语法,使用 '''.*?''' 。然后,您可以将两者与 or 操作结合起来,以查找所有引用的结构: '''.*?'''|'.*?' 。首先指定三引号很重要,否则它们将被视为多个单引号字符串。

然后处理必须像这样对子字符串进行:

Pattern p=Pattern.compile("'''.*?'''|'.*?'");
Matcher m=p.matcher(value);
int normalPos=0, length=value.length();
while(normalPos<length && m.find())
{
int quotePos=m.start(), quoteEnd=m.end();
if(normalPos<quotePos) processNormally(value.substring(normalPos, quotePos));
final boolean tripleQuote=m.end()-m.start()>=6 && value.charAt(quotePos+1)=='\'';
final int skip=tripleQuote? 3: 1;
processQuoted(value.substring(quotePos+skip, quoteEnd-skip));
normalPos=quoteEnd;
}
if(normalPos<length) processNormally(value.substring(normalPos));

关于java - 从正则表达式中检索不匹配和匹配的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18768677/

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