选择没有子字符串的行

时间:2014-10-23 21:39:45

标签: java regex wikipedia

我正试图从这样的文本中选择名称(斯洛伐克转储维基百科):

    |Meno = Hans Joachim
|Plné meno = Aristoteles (???????????)
|Plné meno = Francis Bacon
|Plné meno = Sokrates ({{Cudzojazyčne|grc|????????|pc=n}})
|Meno            = Svätý František z Assisi <br /> ''(Giovanni Battista Bernardone)''
  |Meno = Friedrich Ludwig Gottlob Frege
   |Meno             = Adam František Kollár (Kolárik)
|meno    = [[J. Edgar Hoover|John Edgar Hoover]]
|meno    = [[Benedikt XIV. (1740 – 1758)|Benedikt XIV.]]
|meno    = [[Milan Rastislav Štefánik|Milan Rastislav Štefánik]]
   |Meno             = '''Ján Filc'''
  |Meno = Jean le Rond d'Alembert

输出应该是:

Hans Joachim
Aristoteles
Francis Bacon
Sokrates
Svätý František z Assisi
Friedrich Ludwig Gottlob Frege
Adam František Kollár (Kolárik)
J. Edgar Hoover|John Edgar Hoover
Benedikt XIV. (1740 – 1758)|Benedikt XIV.
Milan Rastislav Štefánik|Milan Rastislav Štefánik
Ján Filc
Jean le Rond d'Alembert

正确编写名称后,此正则表达式正常工作:= *(.*?)$ 但是当有“(???????????)”,HTML标签和“{{”和“}}”之类的东西时,我无法选择没有不需要的子串的名称。

我在this regex tester page (http://regex101.com/r/gS8iQ9/1)上尝试了很多选项,但都没有。

在Java代码中我正在使用

Pattern pattern = Pattern.compile("= *(.*?)$");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
   String foundSubstring = matcher.group(1);
   ...

感谢您提供有关如何在“=”之后选择文字但没有问号,HTML代码等的任何帮助或建议。

2 个答案:

答案 0 :(得分:2)

你的正则表达式几乎是正确的,但你的输入有点诀窍,你可以在一行中完成:

String name = line.replaceAll(".*?=[\\[ ']*([\\p{L}0-9|'. ()–]+[\\p{L}.)]).*", "$1");

请参阅live demo

我已对此进行了测试,并根据您的样本输入生成了所需的输出。

答案 1 :(得分:1)

尝试以下方法:

Pattern pattern = Pattern.compile("=[\\s\\p{Punct}]*(.*?)\\p{Punct}*$");

\p{Punct}代表标点符号:其中一个!“#$%&amp;'()* +, - 。/ :;&lt; =&gt;?@ [] ^ _`{|}〜