Java 选择不带子字符串的行

Java 选择不带子字符串的行,java,regex,wikipedia,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 Ba

我只是想从维基百科的斯洛伐克垃圾堆这样的文本中选择名字:

    |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
正确写入名称后,此正则表达式工作正常:=*.*$ 但是,当存在类似于“??”、HTML标记和{{和}之间的内容时,如果没有不需要的子字符串,我就无法选择名称

我尝试了很多选择,但没有一个奏效

在我使用的Java代码中

Pattern pattern = Pattern.compile("= *(.*?)$");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
   String foundSubstring = matcher.group(1);
   ...
感谢您提供有关如何在=之后选择文本(但不带问号、HTML代码等)的帮助或建议。

请尝试以下操作:

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

\p{Punct}代表标点符号:其中一个是!$%&'*+,-./:@[]^ `{124;}

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

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


我已经对此进行了测试,并根据您的示例输入生成了您想要的输出

♦ 这是我在新代码后尝试此代码文本后的输出:是输出| Plnémeno=Aristoteles???????????新:亚里士多德|Meno=SvätýAugustín new:Svä这会留下一些不需要的字符,也不适用于我们的特殊字符,如“ä”,但谢谢,我将尝试从this@Tunerx我想我已经修好了。这有点棘手-必须使用posix类\p{L}来表示字母。请尝试最新版本。我现在不能测试它-在iPhone上翻代码这很奇怪,在演示中我可以看到它在工作,但在Java中它有不同的输出。例如| Plnémeno=Sokrates{cudzojazne | grc | | pc=n}新:Sokrates尽管在工作,但这不是| Plnémeno=Aristoteles |???????????新:亚里士多德???????????。还有本尼迪克特是好的。。。我现在不确定是否可以在一个正则表达式中捕获所有问题,例如Jan Filc也不工作。另外,维基百科上还有很多我还没听清楚的有问题的句子。。。但是谢谢,现在我知道如何解决这个问题了。@Tunerx我现在在一台电脑前,我可以测试它,最新的版本可以工作。如果您有其他边缘案例不起作用,请将它们发布在您的问题中,让我知道,我会看一看。在我使用的所有测试仪中,它工作得很好。在Java中,除了括号内带问号的那一行之外,一切都正常。。。有很多线路不起作用,Plnémeno=Anaxagoras??????????新:阿纳萨戈拉斯|Plnémeno=阿那克西曼德罗斯????????????新:阿那克西曼德罗斯|Plnémeno=阿那肟类??????????新名称:安那肟??????????。我真的不明白,输入与测试人员中的输入是一样的:谢谢,这在网上非常有效,就像| meno=[[Benedikt XIV.1740–1758 | Benedikt XIV.]]新的:Benedikt XIV。1740年至1758年|贝内迪克特十四世。但这不适用于“新的:新的:新的:新的:新的。”输出总是在新的之后。
String name = line.replaceAll(".*?=[\\[ ']*([\\p{L}0-9|'. ()–]+[\\p{L}.)]).*", "$1");