假如我们有大量类似于下面的数据:
1.神要是公然去跟人作对,那是任何人都难以对付的。 (《荷马史诗》)
2.生存还是毁灭,这是一个值得思考的问题。 (《哈姆霄特》)
3.善良人在追求中纵然迷惘,却终将意识到有一条正途。(《浮士德》)
4.认识自己的无知是认识世界的最可靠的方法。 (《随笔集》)
5.你以为我贫穷、相貌平平就没有感情吗?我向你发誓,如果上帝赋予我财富和美貌,我会让你无法离开我,就像我现在无法离开你一样。虽然上帝没有这么做,可我们在精神上依然是平等的。(《简·爱》)
我们要做的事情是提取出其中的内容和书名,如1.神要是公然去跟人作对,那是任何人都难以对付的。 (《荷马史诗》)我们需要提取出类容“神要是公然去跟人作对,那是任何人都难以对付的。”和书名“荷马史诗”。我们该怎么做呢?下面就让我们用正则表达式来完成它吧。
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());
}
}
}
怎么样,还不错吧。不过值得注意的是在用正则表达式处理文本是时候还要注意全角和半角的问题。如果有时候你发现自己的正则表达式没有什么问题,但是就是不能匹配成功,那么就可以考虑一下是否是标点符号的全角和半角问题。最容易出错的就是全角空格和半角空格,一看就是空格,一匹配就失败。我掉进这个坑里很久才发现原因,希望这一点经验能对您有所帮助。
来源:oschina
链接:https://my.oschina.net/u/2474629/blog/514471