日期:2014-05-20  浏览次数:21000 次

正则表达式提取两个点号之间的文本
如何构造正则,抽取两个“.”号之间的内容?
原文件格式如下:
1..test.major information.http://www.abcdefg.com.2012
2...http://www.abcdefg.com/index.html.2011
3.Mike, G..this is for test.2012
4.Bob, E. J..make a mark.2010,15(2):60-71
……

每一行我想要的数据是两个“.”号之间的
如:
第一行:"",test,major information,http://www.abcdefg.com,2012
第二行:"","",http://www.abcdefg.com/index.html,2011
第三行:Mike, G.,this is for test,2012
第四行:Bob, E. J.,make a mark,2012

Note:
1、点号可能有三种含义,①表示内容的分割符,②外国名字的缩写,③URL的组成
2、表示分割符时,如果两个点号之间没有内容,表明需要截取出的是空串""

如何构造相应的正则表达式进行匹配?

------解决方案--------------------
这个用正则来做不是很完美,因为每个[.]代表的意义不一样,没法区分,所以最好是先按每种意义把[.]转成其它字符,再分割,再把字符转成[.]
这里给出一段不是很完美的正则做法
Java code
String[] sa = { //测试字符串
    "..test.major information.http://www.abcdefg.com.2012",
    "...http://www.abcdefg.com/index.html.2011",
    ".Mike, G..this is for test.2012",
    ".Bob, E. J..make a mark.2010,15(2):60-71"
};
for (String s : sa) {
    //把URL以外的[.]转成[|],再把名字缩写的[|]转成[.],再按[|]分割
    String[] ss = s.replaceAll("(?<!www)[.](?!(html|com))", "|").replaceAll("(?<=[A-Z])[|]", ".").split("[|]"); 
    System.out.println(Arrays.toString(ss));
}