【问题标题】:Select row without substring选择没有子字符串的行
【发布时间】:2014-12-19 16:50:51
【问题描述】:

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

    |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 代码等的任何帮助或建议。

【问题讨论】:

    标签: java regex wikipedia


    【解决方案1】:

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

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

    live demo

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

    【讨论】:

    • ♦ 这是我尝试此代码后的输出(输出“new:”之后的文本)|Plné meno = Aristoteles (???????????) new: Aristoteles (? |Meno = Svätý Augustín new: Svä 这会留下一些不需要的字符,也不适用于我们的特殊字符,例如 ' ä' 但是谢谢,我会试着从这个开始教
    • @Tunerx 我想我已经修好了。这有点棘手 - 必须使用 posix 类 \p{L} 来表示“字母”。尝试最新版本。 (我现在无法测试 - 在 iPhone 上翻阅代码)
    • 这很奇怪,在演示中我可以看到它正在工作,但在 Java 中它有不同的输出。例如|Plné meno = Sokrates ({{Cudzojazyčne|grc|????????|pc=n}}) new: Sokrates ( 是(尽管'(') 工作,但这不是|Plné meno = Aristoteles (???????????) new: Aristoteles (???????????)Benedict 也可以...我现在不太确定是否有可能将所有问题合二为一正则表达式(例如Jan Filc 也不起作用)。此外,维基百科还有更多我还没有发现的有问题的行......但是谢谢,现在我知道如何解决这个问题了。
    • @Tunerx 我现在在一台可以测试它的计算机上,并且最新版本可以工作。如果您有其他不起作用的边缘情况,请将它们发布在您的问题中,让我知道,我会看看。
    • 在所有测试人员中(我使用的是regex101.com/r/gS8iQ9/2),它工作得很好。在 Java 中,一切正常,除了括号内的问号行......有很多行这不起作用|Plné meno = Anaxagoras (??????????) new: Anaxagoras (??????????) |Plné meno = Anaximandros (????????????) new: Anaximandros (????????????) |Plné meno = Anaximenes (??????????) new: Anaximenes (??????????)。我真的不明白,输入与测试人员相同:(
    【解决方案2】:

    尝试以下方法:

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

    \p{Punct} 代表标点符号:之一!"#$%&'()*+,-./:;?@[]^_`{|}~

    【讨论】:

    • 谢谢,这在|meno = [[Benedikt XIV. (1740 – 1758)|Benedikt XIV.]] new: Benedikt XIV. (1740 – 1758)|Benedikt XIV 之类的线上非常有用。但这不适用于像|Plné meno = Sokrates ({{Cudzojazyčne|grc|????????|pc=n}}) new: Sokrates ({{Cudzojazyčne|grc|????????|pc=n|Plné meno = Aristoteles (???????????) new: Aristoteles (??????????? 这样的行。输出总是在“new:”之后。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2018-02-17
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多