假如咱们有大量相似于下面的数据:java
1.神要是公然去跟人做对,那是任何人都难以对付的。 (《荷马史诗》)
2.生存仍是毁灭,这是一个值得思考的问题。 (《哈姆霄特》)
3.善良人在追求中纵然迷惘,却终将意识到有一条正途。(《浮士德》)
4.认识本身的无知是认识世界的最可靠的方法。 (《随笔集》)
5.你觉得我贫穷、相貌平平就没有感情吗?我向你发誓,若是上帝赋予我财富和美貌,我会让你没法离开我,就像我如今没法离开你同样。虽然上帝没有这么作,可咱们在精神上依然是平等的。(《简·爱》)正则表达式
咱们要作的事情是提取出其中的内容和书名,如1.神要是公然去跟人做对,那是任何人都难以对付的。 (《荷马史诗》)咱们须要提取出类容“神要是公然去跟人做对,那是任何人都难以对付的。”和书名“荷马史诗”。咱们该怎么作呢?下面就让咱们用正则表达式来完成它吧。code
import java.util.regex.Matcher; import java.util.regex.Pattern; public class LookAround { private static final String input ="1.神要是公然去跟人做对,那是任何人都难以对付的。 (《荷马史诗》)\n2.生存仍是毁灭,这是一个值得思考的问题。 (《哈姆霄特》)\n3.善良人在追求中纵然迷惘,却终将意识到有一条正途。(《浮士德》)\n4.认识本身的无知是认识世界的最可靠的方法。 (《随笔集》)\n5.你觉得我贫穷、相貌平平就没有感情吗?我向你发誓,若是上帝赋予我财富和美貌,我会让你没法离开我,就像我如今没法离开你同样。虽然上帝没有这么作,可咱们在精神上依然是平等的。(《简·爱》)"; public static void main(String[] args) { /** * 向后查找(?<=) * (?<=(\\d+[\\.\\.]))是匹配1.可是不消费它,也就是最终匹配中没有1. * ([^((]?)*是匹配任意字符,除了(( */ String regexc ="(?<=(\\d+[\\.\\.]))([^((]?)*";//向后查找 /** * 向前查找(?=) * (?<=《)向后查找《 * (?=》)向前查找》 和向后查查同样查找可是不消费它 */ String regext = "(?<=《)(.?)*(?=》)"; Pattern pattern = Pattern.compile(regexc); Matcher matcher = pattern.matcher(input); while(matcher.find()) { System.out.println("内容:"+matcher.group()); } pattern = Pattern.compile(regext); matcher = pattern.matcher(input); while(matcher.find()) { System.out.println("书名:"+matcher.group()); } } }
怎么样,还不错吧。不过值得注意的是在用正则表达式处理文本是时候还要注意全角和半角的问题。若是有时候你发现本身的正则表达式没有什么问题,可是就是不能匹配成功,那么就能够考虑一下是不是标点符号的全角和半角问题。最容易出错的就是全角空格和半角空格,一看就是空格,一匹配就失败。我掉进这个坑里好久才发现缘由,但愿这一点经验能对您有所帮助。
input