1

我有一个像下面这样的场景,

需要从一个字符串中提取的子字符串很少,

示例:主字符串:

<title><spring:message code='cdc.header.title'/><br></span><span><p></p> <spring:message code='cdc.accessdenied.title'/></title>

所以我需要提取<spring:message code='cdc.header.title'/>,<spring:message code='cdc.accessdenied.title'/>

我的意思是那里有什么弹簧标签我想检索那些子字符串List<String>

我不想使用 XML 解析器,我想使用 java PATTERN 匹配器,因为我的文件可能格式不正确。

请帮我解决这个问题。谢谢

4

4 回答 4

2

使用这种方法,只需一行代码即可完成(根据评论更新为新要求):

List<String> springTags = Arrays.asList(str.replaceAll("(?s)^.*?(?=<spring)|(?<=/>)(?!.*<spring).*?$", "").split("(?s)(?<=/>).*?(?=<spring|$)"));

这通过首先剥离任何前导和尾随 xml 包装/字符,然后在标签的 xml 结束/开始处拆分来工作。它实际上会从任何类型的输入中提取所有弹簧标签——无论弹簧标签被丢弃之前还是之后。

下面是一些测试代码:

String str = "<title><spring:message code='cdc.header.title'/> <span></span></br><spring:message code='cdc.accessdenied.title'/></title>";
List<String> springTags = Arrays.asList(str.replaceAll("^.*?(?=<spring)|(?<=/>)(?!.*<spring).*?$", "").split("(?<=/>).*?(?=<spring|$)"));
System.out.println(springTags);

输出:

[<spring:message code='cdc.header.title'/>, <spring:message code='cdc.accessdenied.title'/>]
于 2013-11-07T06:10:24.513 回答
1
<tag> something</tag>

您可以提取“ something”,使用XML 解析器库

于 2013-11-07T05:53:35.153 回答
0

您可以使用 DOM 解析器并将文件解析为 XML 文件。我想您还必须检索其他节点、属性和值,在这种情况下,Parser 将真正帮助您。

于 2013-11-07T05:52:02.433 回答
0

这是一个在纯 Java 中执行此操作的示例:

public static ArrayList<String> parseDocument(
        final String document,
        final String begin,
        final String end) {

    ArrayList<String> subs = new ArrayList<String>(0);

    document_parse:
        for (int i = 0, h, j, k; i < document.length(); ) {

            for (h = i, k = 0; k < begin.length(); h++, k++) {
                if (h > document.length() - begin.length()) {
                    break document_parse;

                } else if (document.charAt(h) != begin.charAt(k)) {
                    i++;
                    continue document_parse;
                }
            }

            end_search:
                for ( ; ; h++) {
                    if (h > document.length() - end.length()) {
                        break document_parse;
                    }

                    for (j = h, k = 0; k < end.length(); j++, k++) {
                        if (document.charAt(j) != end.charAt(k)) {
                            continue end_search;
                        }
                    }

                    if (k == end.length()) {
                        break;
                    }
                }

            h += end.length();

            subs.add(document.substring(i, h));

            i = h;
        }

    return subs;
}

这种事情可能比正则表达式更快。循环有点复杂,但我测试了它并且它有效。

于 2013-11-07T06:19:37.750 回答