【问题标题】:How to capture certain text within a StringBuffer Java [duplicate]如何在 StringBuffer Java 中捕获某些文本 [重复]
【发布时间】:2016-06-30 12:26:16
【问题描述】:

我有一个包含以下内容的 StringBuffer 对象:

<ET>read input: 1.629ms</ET>
<ET>There were 3 errors:
<Error>
    <ErrorId>AllConditionsTrue</ErrorId>
    <MetaData>
        <Entry>
            <Key>Balance Due</Key>
            <Value>1500.99</Value>
        </Entry>
    </MetaData>
</Error>

<Error>
    <ErrorId>Opposite</ErrorId>
    <MetaData>
        <Entry>
            <Key>Node</Key>
        </Entry>
    </MetaData>
</Error>

<Error>
    <ErrorId>minInclusive</ErrorId>
    <MetaData>
        <Entry>
            <Key>Description</Key>
            <Value>Wages Amount</Value>
        </Entry>
    </MetaData>
</Error>

: 0.027ms</ET>
<ET>convert: 319.414ms</ET>
<FORM id="123"/>
<DATA size="11920"/>
<ERROR code="0"/>

如何仅捕获错误标记处和内部的文本(&lt;Error&gt; some text &lt;/Error&gt;)。所以我的新 String 或 StringBuffer 对象包含:

<Error>
    <ErrorId>AllConditionsTrue</ErrorId>
    <MetaData>
        <Entry>
            <Key>Balance Due</Key>
            <Value>1500.99</Value>
        </Entry>
    </MetaData>
</Error>

<Error>
    <ErrorId>Opposite</ErrorId>
    <MetaData>
        <Entry>
            <Key>Node</Key>
        </Entry>
    </MetaData>
</Error>

<Error>
    <ErrorId>minInclusive</ErrorId>
    <MetaData>
        <Entry>
            <Key>Description</Key>
            <Value>Wages Amount</Value>
        </Entry>
    </MetaData>
</Error>

如何使用 Java 实现我的目标?

编辑

尝试你们的两个解决方案:

Pattern p = Pattern.compile("<Error>.*?<\\/Error>", Pattern.DOTALL);
Matcher m = p.matcher(buf.toString());

String errorText = "";

while (m.find()) {
    errorText = m.group(1);
}

我似乎只得到 3 个错误标签元素,而不是全部 3 个。

例子:

<Error>
    <ErrorId>minInclusive</ErrorId>
    <MetaData>
        <Entry>
            <Key>Description</Key>
            <Value>Wages Amount</Value>
        </Entry>
    </MetaData>
</Error>

【问题讨论】:

  • 请不要使用StringBuffer,因为它在十多年前就被StringBuilder取代了。

标签: java regex xml string stringbuffer


【解决方案1】:

正则表达式:

<Error>.*?<\/Error>

Demo

【讨论】:

  • 谢谢,但这个正则表达式似乎只抓住了一个错误标签元素,请参阅我对原始帖子的编辑
  • @arabian_albert 检查此stackoverflow.com/questions/16517689/…
  • 谢谢@Tim007 我肯定需要阅读正则表达式
【解决方案2】:

SaxParse 将是比字符串解析器更好的解决方案。

它也将便于您将来参考。

参考这个萨克斯文档:

http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParser.html

【讨论】:

    【解决方案3】:

    请注意,您的字符串包含新行,因此您必须使用\n。试试这个:

    <Error>((?:.*?\n?)+.*?)<\/Error>
    

    查看Regex101

    【讨论】:

    • 立即尝试您的解决方案
    • 谢谢,您的解决方案适用于这个特定问题。现在这适用于任意数量的错误标签吗?
    • 已更新。试试看:)
    • 您忘记在换行符 \\n 处加倍 \\。你只有一个\n。
    • @arabian_albert while (m.find()) { System.out.println(m.group(1)); } 它可能会打印所有 3 个。errorText = m.group(1); 你只会得到最后一个,其他会被覆盖,因为在循环中,检查这个stackoverflow.com/questions/6417435/…
    猜你喜欢
    • 2011-11-21
    • 2023-03-07
    • 1970-01-01
    • 2011-03-17
    • 2012-09-26
    • 2012-08-13
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多