【问题标题】:Java preg_match arrayJava preg_match 数组
【发布时间】:2011-07-02 08:22:25
【问题描述】:

有字符串strng = "<title>text1</title><title>text2</title>"; 如何获得类似的数组

arr[0] = "text1";
arr[1] = "text2";

我尝试使用它,但结果有,而不是数组text1</title><title>text2

Pattern pattern = Pattern.compile("<title>(.*)</title>");
Matcher matcher = pattern.matcher(strng);
matcher.matches();

【问题讨论】:

  • 我认为你需要想出更多的例子来说明你想要什么。您是否希望每个数组项提取一个字母序列,后跟一个数字?
  • 嘿,我在里面找到了标记! ...为什么要使用正则表达式解析 XML?
  • 哦,现在说得通了!

标签: java html regex


【解决方案1】:

这看起来像是无效的 XML,因为没有容器元素,如果您制作了有效的 XML,您可以使用 XML 解析器对其进行解析。对于像上面这样的小sn-ps,我会推荐JDOM

如果是 XML 或 HTML,请不要尝试使用正则表达式,因为 XML 和 HTML 不是正则语言,使用正则表达式都无法成功解析,因为它们无法保持足够的状态。只需搜索 stackoverflow 以获取更多详细信息。这经常出现,并且有很多关于为什么不这样做以及为什么它不起作用的信息。

【讨论】:

    【解决方案2】:

    虽然我同意使用 XML / HTML 解析器 is a better alternative in general,但您的场景很容易使用正则表达式解决:

    List<String> titles = new ArrayList<String>();
    Matcher matcher = Pattern.compile("<title>(.*?)</title>").matcher(strng);
    while(matcher.find()){
        titles.add(matcher.group(1));
    }
    

    注意非贪婪运算符.*? 并使用matcher.find() 而不是matcher.matches()

    参考:

    【讨论】:

    • 那个正则表达式当然是最简单的选择,太好了!哦,你的链接标题很棒(parsing-html-the-cthulhu-way)
    • @Johan 是的,我希望 cthulhu 是我的主意。
    【解决方案3】:

    看起来您需要一个为此类工作构建的 HTML / XML 解析器。

    虽然,如果你有一个small受控信息(如上面的one行)你可能使用诸如

    之类的正则表达式对matcher.find() 进行迭代
    (?<=\\>)\\w+(?=\\<)
    

    再一次,自从regex cannot parse HTML/XML 以来,任何比你的衬线更复杂的东西都应该由适当的解析器解析。

    【讨论】:

    • 虽然这实际上会给出一个长度为 5 的数组,不是吗? ({ "", "text1", "", "text2", "" })
    • 是的,确实,我会修改我的答案,然后看,它已经变得复杂了 -> HTML/XML 解析器推荐的方法。
    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多