我想找一个以<p>开头,以最近一个</p>结尾的字符串,中间可能出现换行,这样的表达式
(?>=<p>).*?(?=<\p>)
这样写好像不行
请高手帮忙
(?>=<p>).*?(?=<\p>)
这样写好像不行
请高手帮忙
解决方案 »
- 菜鸟请教,类中,数据是怎么传递的
- 关于包org.apache.lucene.ant
- for(Ball b : new ArrayList<Ball>))是什么意思啊?
- 请问各为高手在java 怎样截取web服务器流信息?
- 一个Swing的小问题,急!
- 请问如何在JAVA里面调用用VC写的DLL里的接口?
- java大神求救,急救,在线等
- 标准送分题
- 用JDBC-ODBC访问ACCESS,能不能用ResultSet的deleteRow()方法?我怎么用的不行?另外,我在使用CachedRowSet类时,当调用acceptChange()方法时
- java jxl读取带空格路径的文件问题
- 如何用 Java Swing 做一个延时滚动条
- 求助!!!—— 一道面试题
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));
}
}
}
String regex = "<p>(.+?)</p>";
Matcher matcher = Pattern.compile(regex,Pattern.DOTALL | Pattern.MULTILINE).matcher(input)); //有换行情况下用DOTALL模式
matcher.find();
String result=matcher.group(1);
(?<=<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());
}