2012-02-07 119 views
2

我对正则表达式的经验很少,所以在此先感谢。java字符串正则表达式分隔符

我有一个像这样的字符串,

Doe Jane,Doe John。 Suess博士的作品。哈佛出版社(1984)。

我正在使用string.split(正则表达式)将字符串拆分为基于我提供的正则表达式的字符串[]。我想将它分成作者,标题和出版信息。问题只是使用[。]在博士之后分解它。

如何写一个regext来包含'。'但排除诸如'Dr.'之类的东西或'先生' ?

感谢

+3

如果你想为书目条目编写一个通用的解析器,你必须剔除比正则表达式更“聪明”的东西。仅使用正则表达式意味着它将不得不考虑每个可能的由句点分隔的缩写,这基本上不可行。 – 2012-02-07 19:09:59

回答

4

我建议使用专门的包解析书目条目,如ParsCit

我试过了他们的Web界面,它似乎正确地解析了你的开箱即用的例子。

使用正则表达式,您将面临一场艰苦的斗争,因为您必须弄清楚并说明标题中每一次可能的使用。

+1

+1我的确了解它。谢谢! – Eugene 2012-02-07 19:19:05

1

可以使用负回顾后:

(?<!Dr|Mr)\. 
1

使用负回顾后发正则表达式是这样的:

str.split("(?<!(D|M|J|S)r)\\.\\s*"); 

示例代码:

String str="Mr. Doe Jane, Doe John Sr.. The Works of Dr. Suess. Harvard Press(1984)."; 
String[] arr = str.split("(?<![DMJS]r)\\.\\s*"); 
for (int i=0; i<arr.length; i++) 
    System.out.println(arr[i]); 

OUTPUT:

Mr. Doe Jane, Doe John Sr. 
The Works of Dr. Suess 
Harvard Press(1984) 
0

这有此示例中使用某种负回顾后,如:

String input = "Doe Jane, Doe John. The Works of Dr. Suess. Harvard Press(1984)"; 
String [] tokens = input.split("(?<!Dr|Mr)\\."); 
for(String token : tokens){ 
     // this will output3 tokens 
    System.out.println(token); 
} 

它说的分割上。 (点),但后面的东西(?<符号)这个点必须是不同的(!符号)然后博士或(|符号)先生

干杯,尤金。