我正试图从这样的文本中选择名称(斯洛伐克转储维基百科):
|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代码等的任何帮助或建议。
答案 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;?@ [] ^ _`{|}〜