我的情况如下,
需要从一个字符串中提取的子字符串很少,
示例: 主字符串:
<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匹配器,因为我的文件可能不是很好。
请帮我解决这个问题。 感谢
答案 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;
}
这种事情可能比正则表达更快。循环有点复杂,但我测试了它并且它有效。