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

Java 从正则表达式中检索不匹配和匹配的文本,java,regex,Java,Regex,我正在尝试搜索一个可以包含html和纯文本的Java字符串。如果html用单个记号(“文本”)包装,或者html块用三个记号(“Sampletext”)包装,我不需要从字符串中删除html。如果html没有用一个或三个勾号包装,那么我需要删除html 如果内容没有混合,下面的方法就可以了。我想修改它,以便 String value=“此处未勾选内容和此处“混合”内容”将被写入内存/作为此处未勾选内容和此处“混合”内容返回” 我认为我需要更改正则表达式,以便只将未勾选的(单个或三个)内容传递给我的

我正在尝试搜索一个可以包含html和纯文本的Java字符串。如果html用单个记号
(“文本”)
包装,或者html块用三个记号
(“Sampletext”)
包装,我不需要从字符串中删除html。如果html没有用一个或三个勾号包装,那么我需要删除html

如果内容没有混合,下面的方法就可以了。我想修改它,以便
String value=“此处未勾选内容和此处“混合”内容”
将被写入内存/作为
此处未勾选内容和此处“混合”内容返回”

我认为我需要更改正则表达式,以便只将未勾选的(单个或三个)内容传递给我的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();
    }
}
import java.io.IOException;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入org.apache.commons.lang.StringUtils;
导入org.jsoup.jsoup;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入com.fasterxml.jackson.core.jsongGenerationException;
导入com.fasterxml.jackson.core.JsonGenerator;
导入com.fasterxml.jackson.databind.SerializerProvider;
导入com.fasterxml.jackson.databind.ser.std.std序列化程序;
公共类HtmlSerializer扩展了StdSerializer{
私有静态最终记录器LOG=LoggerFactory.getLogger(HtmlSerializer.class);
私有静态最终模式singlePattern=Pattern.compile(“.*”);
私有静态最终模式blockPattern=Pattern.compile(“'.*”);
受保护的HtmlSerializer(){
super(String.class);
}
@凌驾
public void serialize(字符串值、JsonGenerator jgen、SerializerProvider提供程序)引发IOException,
JsonGenerationException{
if(StringUtils.isNotBlank(值)){
Matcher blockMatcher=blockPattern.Matcher(值);
Matcher singleMatcher=singlePattern.Matcher(值);
如果(!blockMatcher.find()&&!singleMatcher.find()){
jgen.writeString(html2text(value));
}否则{
jgen.writeString(值);
}
}否则{
jgen.writeString(值);
}  
}
私有静态字符串html2text(字符串html){
返回Jsoup.parse(html.text();
}
}

您的模式无法正常工作,因为
*
尽可能多地匹配。因此
.*
将从第一次出现的
'
到最后一次出现的
'
匹配,而不管中间有多少个
'
。在您的示例中,它将匹配整个序列
''mi'固定的“”内容“”在此处“”

要解决这个问题,最简单的方法是使用“不情愿的量词”
'.*?
将尽可能少地匹配,因此在下一次出现
'
时停止

这同样适用于您的组语法,请使用
'.*?'
。然后您可以将两者与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));
Pattern p=Pattern.compile(“'.*?“'|'.*?”);
匹配器m=p.Matcher(值);
int normalPos=0,length=value.length();
while(normalPos)