我想找一个以<p>开头,以最近一个</p>结尾的字符串,中间可能出现换行,这样的表达式
(?>=<p>).*?(?=<\p>)
这样写好像不行
请高手帮忙

解决方案 »

  1.   

    (?<= <p>).*(?= <\p>) 这样好像就行啦
      

  2.   


    import  java.util.regex.Pattern;
    import java.util.regex.Matcher;public class Test{
    public static void main(String[] args){
    String text = "<p>dlfdjlflaldlfld\ndfdf</p>";
    String regex = "<p>((.|\n)*?)</p>";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    if(matcher.find()){
    System.out.println(matcher.group(1));
    }
    }
    }
      

  3.   

    没有必要用lookahead和lookbehind,这样写就可以String input="........"    //你的正文
    String regex = "<p>(.+?)</p>";
    Matcher matcher = Pattern.compile(regex,Pattern.DOTALL | Pattern.MULTILINE).matcher(input)); //有换行情况下用DOTALL模式
    matcher.find();
    String result=matcher.group(1);
      

  4.   

    (?<= <p>).*?(?= <\/p>) 
      

  5.   

    小数点“.”匹配除了换行符“\n”外的任意字符,有换行时可以用(.|\n)来匹配任意一个字符
    (?<=<p>)(.|\n)*?(?=</p>)
    但是这样写的效率太低,优化一下,可以用[\d\D]、[\w\W]、[\s\S]之一来匹配任意字符
    (?<=<p>)[\s\S]*?(?=</p>)
    由于使用了非贪婪模式,在源字符串复杂的情况下,效率仍然较低,可以用环视+贪婪模式来提高匹配效率
    (?<=<p>)(?:(?!</p>)[\s\S])*(?=</p>)
    此时的正则也还是有效率提升空间的,因为使用了贪婪模式,所以可以使用占有优先量词进行优化
    (?<=<p>)(?:(?!</p>)[\s\S])*+(?=</p>)String test="我想找一个以 <p>开头,以\n最近一个 </p>结尾的<p>字符串,\n中间可能出现换行</p>,这样的表达式 ";  
    String reg = "(?<=<p>)(?:(?!</p>)[\\s\\S])*+(?=</p>)";
    Matcher m = Pattern.compile(reg).matcher(test); 
    while(m.find())
    {
    System.out.println(m.group());
    }