在java中查找子字符串模式

时间:2013-11-07 05:43:29

标签: java regex string

我的情况如下,

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

示例: 主字符串:

<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 个答案:

答案 0 :(得分:2)

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

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

这首先剥离任何前导和尾随xml包装/字符,然后在xml end / start标签上拆分。它实际上将从任何类型的输入中提取所有弹簧标签 - 无论是在弹簧标签被扔掉之前还是之后。

这是一些测试代码:

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'/>]

答案 1 :(得分:1)

<tag> something</tag>

您可以使用XML parser library提取“something”。

答案 2 :(得分:0)

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

答案 3 :(得分: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;
}

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